1

drool.netを使用する単純なアプリケーションを実行しようとしています。実行するたびに、アプリケーションがクラッシュしましたbuilder.AddPackageFromDrl("DroolsApp.Rules.drl", stream);。エラーは、NullReferenceExceptionが処理されておらず、オブジェクト参照がオブジェクトのインスタンスを設定していないことを示していました。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: 
4

2 に答える 2

3

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

cd $(TargetDir)
del CompiledRules0.*
于 2012-12-06T09:47:31.213 に答える
0

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

于 2012-04-22T13:18:12.917 に答える