[c#]如何使散发对 DLL 动态编译类

标签: dll C#
发布时间: 2013/12/8 14:44:43
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一些数据,我用来创建一个程序。对于示例的目的,这是生成的代码:

using System;

namespace MyNamespace {
    public class BuiltProgram{
        public bool Eval(int x, int y, int z, out int ret) {
            Console.WriteLine("Test");
            ret = x + y + z;
            return true;
        }    
    }
}

我使用它生成的代码如下所示:

var factory = new ProgramFactory(tree);
var newProgram = factory.GetCompiledProgram();

// Program parsing code...
SyntaxTree programSyntaxTree = SyntaxTree.ParseText(newProgram);
var outputFile = "Compiled.dll";
var compilation = Compilation.Create(outputFile,
    options: new CompilationOptions(OutputKind.DynamicallyLinkedLibrary),
    syntaxTrees: new[] { programSyntaxTree }
);

FileStream file;
using (file = new FileStream(outputFile, FileMode.Create)) {
    EmitResult result = compilation.Emit(file);
}
// THIS CODE BREAKS:
Assembly assembly = Assembly.LoadFile(file.Name);

Type type = assembly.GetType("BuiltProgram");
var obj = Activator.CreateInstance(type);
int ret = 0;
type.InvokeMember("Eval",
    BindingFlags.Default | BindingFlags.InvokeMethod,
    null,
    obj,
    args: new[] {
        (object)5,
        (object)10,
        (object)2,
        ret
    }
);

因为它说它不具有程序集清单中,但我看看"Compiled.dll",在它中没有任何数据,它将中断在生产线上。我究竟做错了?

解决方法 1:

您必须添加对 mscorlib 的引用。

这将使它的工作:

 var compilation = Compilation.Create(outputFile,
                options: new CompilationOptions(OutputKind.DynamicallyLinkedLibrary),
                syntaxTrees: new[] { programSyntaxTree },
                references: new [] { new MetadataFileReference(typeof(object).Assembly.Location) }
        );

同时访问您的类型,还添加命名空间。

Type type = assembly.GetType("MyNamespace.BuiltProgram");

你可能很难出去参数值。看看这个

赞助商