我一直在使用 罗莱克斯 处理 RDF-s 的库。它附带了一个名为 OwlGrinder.exe 的设计时 GUI 工具,该工具可以从我的 OWL 本体生成 C# 帮助程序类(准确地说是 .NET 程序集)。我想知道是否有人知道我是否可以在运行时以编程方式执行相同的操作。

有帮助吗?

解决方案

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内山

其他提示

是的,Lame 先生,您可以通过编程方式生成 .NET 代码。

有几个选择。

  1. 将代码创建为文本。
    您可以从应用程序内编译任何 .cs 或 .vb 源文件。作为初学者,请参阅 Microsoft.CSharp.CSharpCodeProvider 类的帮助。您以编程方式调用编译器,指定要嵌入的资源、生成的程序集的放置位置、依赖项等。这里的一种情况是使用 template.cs 文件,在其中嵌入更多代码,然后编译它。结果是由该代码生成的程序集(.dll 或 .exe 或 .netmodule 如果您愿意)。然后,您可以使用反射加载该程序集并调用它。

  2. 使用文档对象模型创建代码。
    这里的相关功能区域称为“CodeDom”,它的工作方式类似于网页的 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);

等等等等您可以在代码中添加常规方法、各种语句等。AFAIK CodeDom 的东西支持该语言支持的一切。您可以执行 lambda 和 linq 表达式、条件和控制流等任何操作。

然后,您可以编译该类,并再次生成一个程序集,您可以将其保存到磁盘或保留在内存中并动态加载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top