2012-04-20 1 views
1

私はdrool.netを使用する単純なアプリケーションを実行しようとしています。実行するたびに、アプリケーションがクラッシュしたbuilder.AddPackageFromDrl("DroolsApp.Rules.drl", stream);エラーは、NullReferenceExceptionが未処理であり、オブジェクト参照がオブジェクトのインスタンスを設定していないことを示しました。私はdrlファイルを変更しようとしましたが、エラーはまだ存在していました。私は何か不足していますか?また、drools.netを使用するための詳細なチュートリアルを提供するサイトがあります。私は単純なメモ帳を使用しているので、drlファイルを作成および編集するための特定のプログラムが必要ですか?事前にdrools.net DRLファイルを読む

おかげ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using org.drools.dotnet.compiler; 
using org.drools.dotnet.rule; 
using org.drools.dotnet; 
using System.IO; 
using System.Reflection; 

namespace DroolsApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     {    
      PackageBuilder builder = new PackageBuilder(); 
      Stream stream = Assembly.GetExecutingAssembly() 
      .GetManifestResourceStream("DroolsApp.Rules.drl"); 
      builder.AddPackageFromDrl("DroolsApp.Rules.drl", stream); 
      Package pkg = builder.GetPackage(); 
      RuleBase ruleBase = RuleBaseFactory.NewRuleBase(); 
      ruleBase.AddPackage(pkg);    
      executeRules(ruleBase, 5); 
      executeRules(ruleBase, 6); 
      executeRules(ruleBase, 7); 
     } 

     public static void executeRules(RuleBase ruleBase, int amount) 
     { 
      WorkingMemory workingMemory = ruleBase.NewWorkingMemory(); 
      Quest quest = new Quest(); 
      quest.Value = amount; 
      workingMemory.assertObject(quest); 
      workingMemory.fireAllRules(); 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace DroolsApp 
{ 
    class Quest 
    { 
     public int Value { set; get; } 
    } 
} 

DRL File:  

package DroolsApp 

rule "NumberFive" 
    when 
     quest : Quest(Value == 5) 
    then 
      Console.WriteLine("FIVE"); 
end 

rule "NumberSix" 
    when 
     quest : Quest(Value == 6) 
    then 
      Console.WriteLine("SIX"); 
end 

スタックトレース:

System.NullReferenceException was unhandled 
    Message=Object reference not set to an instance of an object. 
    Source=drools.dotnet 
    StackTrace: 
     at org.drools.dotnet.semantics.DotnetClassTypeResolver.resolveType(String className) 
     at org.drools.semantics.java.RuleBuilder.build(ColumnDescr columnDescr) 
     at org.drools.semantics.java.RuleBuilder.build(RuleDescr ruleDescr) 
     at org.drools.semantics.java.RuleBuilder.build(Package pkg, RuleDescr ruleDescr) 
     at org.drools.compiler.PackageBuilder.addRule(RuleDescr ruleDescr) 
     at org.drools.compiler.PackageBuilder.addPackage(PackageDescr packageDescr) 
     at org.drools.compiler.PackageBuilder.addPackageFromDrl(String fileName, Reader reader) 
     at org.drools.dotnet.compiler.PackageBuilder.AddPackageFromDrl(String fileName, Stream drlStream) 
     at MinimalDroolsForm.Program.Main(String[] args) in C:\Users\Carl\Desktop\DroolsApp\Program.cs:line 19 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

投稿を編集してNullReferenceExceptionのスタックトレース全体を含めると、手伝いやすくなります。 – Fuhrmanator

答えて

3

確かにdrlファイルにエラーがあります。すべてのルールとインポートを削除し、コンパイルしてから、1行と繰り返しを追加してください(ただし、検証は必要です)。 Drools.netは、NullReferenceExceptionのコンパイルエラーや、CompiledRules0.dllの読み込みエラー(生成されなかったため)に反応します。以前に生成されたCompiledRules0.dllを削除するPre-build Build Eventを追加することも良いことです(Drools.netが前回使用したファイルの生成に失敗した場合)。コードは次のとおりです。

cd $(TargetDir) 
del CompiledRules0.* 
+0

スクリプトをプレビルドイベントに追加しました。 DLLは削除されますが、新しいDLLを生成することはできませんでした。助言がありますか? –

+0

私はそれを使用して以来、それは長い時間でしたが、一般に、スクリプトのエラーはDLLの不足を引き起こします。可能な限り単純なスクリプトをコンパイルしてビルドしてください。 – ZimaXXX

+0

問題が見つかりました。新しいソリューションを初めて作成するときは、次のようにする必要があります。droolsファイルはリソースで、Build Actionは組み込みリソースです。 –

0

つのヒント: 1)GetManifestResourceStreamメソッドを呼び出すときに、パラメータとして名前空間とファイル名を渡すようにしてください。 2)ビジュアルスタジオ(使用している場合)、ルールファイルの特権、ビルドアクションを埋め込みリソースに設定します。

+0

ルールファイルは埋め込みリソースとして既に設定されており、GetManifestResourceStreamはパラメータ名としてファイル名のみを受け入れます – Pinzel