ROWLEXを使用したOWLファイルからのアセンブリのプログラムによる生成
質問
私はこれまで使用してきました ロウレックス RDF-を処理するためのライブラリ。これには、OWL オントロジーから C# ヘルパー クラス (正確には .NET アセンブリ) を生成できる、OwlGrinder.exe と呼ばれるデザインタイム GUI ツールが付属しています。実行時にプログラムで同じことができるかどうかを知っている人はいるでしょうか。
解決
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を使用すると、アセンブリをアンロードすることはできませんので、ここで気をつけなければなりません。したがって、あなたはあなたの以前の実行からアセンブリを取り除くことはできません。解決策は、あなたがアンロードすることができ、新しいアプリケーションドメインで生成コードを毎回実行することです。 OwlGrinder.exeはまさにこれは、あなたがMainForm.cs内でピークに達する場合がありますん。
他のヒント
はい、Lame さん、プログラムで .NET コードを生成できます。
いくつかのオプションがあります。
コードをテキストとして作成します。
アプリ内から任意の .cs または .vb ソース ファイルをコンパイルできます。まず、Microsoft.CSharp.CSharpCodeProvider クラスのヘルプを参照してください。コンパイラをプログラムで呼び出して、埋め込むリソース、生成されたアセンブリの配置場所、依存関係などを指定します。ここでの 1 つのシナリオは、template.cs ファイルを使用し、そこにもう少しコードを埋め込んでコンパイルすることです。結果は、そのコードから生成されたアセンブリ (必要に応じて .dll または .exe または .netmodule) です。その後、そのアセンブリをロードし、リフレクションを使用して呼び出すことができます。ドキュメント オブジェクト モデルを使用してコードを作成します。
ここで関連する機能領域は「CodeDom」と呼ばれ、.NET コードの作成にドキュメント オブジェクト モデルが使用されることを除いて、Web ページの HTML DOM のように機能します。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 のものはその言語がサポートするものをすべてサポートしています。ラムダ式、LINQ 式、条件式、制御フローなど何でも実行できます。
その後、そのクラスをコンパイルし、ディスクに保存したり、メモリに保持して動的に読み込むことができるアセンブリを再度生成できます。