2012-04-20 4 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 파일에 오류가 있습니다. 모든 규칙과 가져 오기를 제거하고 컴파일 한 다음 한 줄 및 반복을 추가하십시오 (유효성을 검사해야 함). Drools.net은 컴파일 오류에 대해 NullReferenceException 또는 CompiledRules0.dll로드 오류 (생성되지 않았으므로)에 대해 대응합니다. 이전에 생성 된 CompiledRules0.dll을 삭제하는 사전 빌드 빌드 이벤트를 추가하는 것도 좋은 방법입니다 (Drools.net이 이전 파일을 사용하는 파일을 생성하지 못하는 경우). 코드는 다음과 같습니다.

cd $(TargetDir) 
del CompiledRules0.* 
+0

미리 빌드 이벤트에 스크립트를 추가했습니다. dll이 삭제되었지만 새 dll을 생성 할 수 없습니다. 어떤 제안? –

+0

사용 후 오랜 시간이 걸렸지 만 일반적으로 스크립트의 오류로 인해 DLL이 부족합니다. 가능한 가장 간단한 스크립트를 컴파일하고 빌드하십시오. – ZimaXXX

+0

문제점을 발견했습니다. 새 솔루션을 처음 만들 때 다음을 수행해야합니다. drools 파일은 리소스이고 빌드 작업은 포함 리소스입니다. –

0

두 힌트 : 1) GetManifestResourceStream 메서드를 호출 할 때, 매개 변수로 네임 스페이스와 파일 이름을 통과해야합니다. 2) Visual Studio (사용중인 경우), 규칙 파일 properites, 빌드 작업을 포함 된 리소스로 설정하십시오.

+0

규칙 파일이 이미 포함 된 리소스로 설정되어 있고 GetManifestResourceStream은 매개 변수로 파일 이름 만 허용합니다. – Pinzel