2009-05-14 12 views
2

私はRDF-sを処理するためにROWLEXライブラリを使用しています。 OwlGrinder.exeと呼ばれるGUIツールで、OWLオントロジからC#ヘルパークラス(正確には.NETアセンブリ)を生成することができます。実行時にプログラム的に同じことをすることができるかどうか誰かが知っているのだろうかと思います。ROWLEXを使用してOWLファイルからアセンブリをプログラムで生成する

答えて

4

ROWLEXはちょうどオープンソースになったので、OwlGrinder.exeのコードを実際に見てそこからコードをコピーする機会があります。しかし、ここでは簡単な例です:あなたは、実行時にアセンブリを生成する場合

private NC3A.SI.Rowlex.AssemblyGenerator generator; 

    private void RunAssemblyGeneration(XmlDocument ontologyFileInRdfXml) 
    { 
     this.generator = new NC3A.SI.Rowlex.AssemblyGenerator(); 
     this.generator.GenerateAsync(ontologyFileInRdfXml, "myAssemblyName", 
             null, this.OnGenerationFinished); 
    } 

    private void OnGenerationFinished(string errorMessage) 
    { 
     if (errorMessage == null) 
     { 
      // Success 
      // Displaying warnings and saving result 
      string[] warnings = this.generator.Warnings; 
      this.generator.SaveResult(@"C:\myAssemblyName.dll"); 
       // Important! One generator instance can be executed only once. 
       this.generator = null; 
       this.RejoiceOverSuccess(); 
      } 
     else 
     { 
       // Failure 
       this.MournOverFailure(); 
      } 

    } 

、私はあなたのユーザーの要求として再びその何度もリピートしたい場合がありますことを前提としています。 .NETではアセンブリをアンロードすることができないため、ここで注意する必要があります。したがって、以前の実行からアセンブリを削除することはできません。解決策は、アンロードできる新しいAppDomainで毎回生成コードを実行することです。 OwlGrinder.exeはこれを正確に実行しますが、MainForm.csをピークにしたい場合があります

2

はい、ラメ氏は、プログラムで.NETコードを生成できます。

いくつかのオプションがあります。

  1. コードをテキストとして作成します。
    アプリ内から任意の.csまたは.vbソースファイルをコンパイルできます。スターター用のMicrosoft.CSharp.CSharpCodeProviderクラスのヘルプを参照してください。プログラムを使用して、埋め込むリソース、生成されたアセンブリを格納する場所、依存関係などを指定して、コンパイラを呼び出します。ここでのシナリオの1つは、template.csファイルを使用してもう少しコードを埋め込み、コンパイルすることです。結果は、そのコードから生じるアセンブリ(必要に応じて.dllまたは.exeまたは.netmodule)です。その後、リフレクションを使用して、そのアセンブリをロードして呼び出すことができます。

  2. ドキュメントオブジェクトモデルを使用してコードを作成します。
    ここで関連する機能領域は "CodeDom"と呼ばれ、Webページ用のHTML DOMのように機能しますが、ドキュメントオブジェクトモデルを使用して.NETコードを作成する点が異なります。 DOMエレメントを使用して、プログラムでプログラムを構築します。 CodeDOM物の

例:

var class1 = new System.CodeDom.CodeTypeDeclaration(className); 
class1.IsClass=true; 
class1.TypeAttributes = System.Reflection.TypeAttributes.Public; 
class1.Comments.Add(new System.CodeDom.CodeCommentStatement("This class has been programmatically generated")); 
// add a constructor to the class 
var ctor= new System.CodeDom.CodeConstructor(); 
ctor.Attributes = System.CodeDom.MemberAttributes.Public; 
ctor.Comments.Add(new System.CodeDom.CodeCommentStatement("the null constructor")); 
class1.Members.Add(ctor); 

// add one statement to the ctor: an assignment 
// in code it will look like; _privateField = new Foo(); 
ctor.Statements.Add(new System.CodeDom.CodeAssignStatement(new System.CodeDom.CodeVariableReferenceExpression("_privateField"), new System.CodeDom.CodeObjectCreateExpression(fooType))); 


// include a private field into the class 
System.CodeDom.CodeMemberField field1; 
field1= new System.CodeDom.CodeMemberField(); 
field1.Attributes = System.CodeDom.MemberAttributes.Private; 
field1.Name= "_privateField"; 
field1.Type=new System.CodeDom.CodeTypeReference(fooType); 
class1.Members.Add(field1); 

などなどあなたがように定期的な方法は、コード内の文のすべての種類などを追加することができます。 CodeDomは、言語がサポートしているすべてのものをサポートしています。あなたはlambdasとlinqの式、条件と制御フロー、何でもすることができます。

次に、そのクラスをコンパイルして、ディスクに保存したり、メモリに保存して動的にロードできるアセンブリを作成できます。

関連する問題