c# – CreateMethodInfo:无法加载文件或程序集

以前在循环中我有一个对CreateMethodInfo的工作调用,并且方法签名没有参数.

现在我已经改变了这个(出于性能原因),所以有问题的方法有参数,现在它失败并出现以下错误信息:

Could not load file or assembly
‘file:///C:\Users\me\AppData\Local\Temp\qz5wsaeb.dll’ or one of
its dependencies.

我在说这个:

var method = CreateMethodInfo(script, "Methods", "GetValue");
method.Invoke(null, new object[] { control });

脚本的价值:

public class Methods
{
    public static void GetValue(Control control)
    {
        // During runtime this part is dynamic and can change
        control.Location = new System.Drawing.Point(165, 70);
        control.Size = new System.Drawing.Size(204, 107);
    }
}

我看不出我做错了什么.基本上我想调用方法并传递一个参数,在本例中是一个Control.

编辑

CreateMethodInfo:

public static MethodInfo CreateMethodInfo(string script, string className, string methodName)
{
    using (var compiler = new CSharpCodeProvider())
    {
        var parms = new CompilerParameters
        {
           GenerateExecutable = false,
           GenerateInMemory = true,
           ReferencedAssemblies = { "System.Drawing.dll","System.Windows.Forms.dll" }
        };
        return compiler.CompileAssemblyFromSource(parms, script)
            .CompiledAssembly.GetType(className)
            .GetMethod(methodName);
    }
}

最佳答案 正如您所做的那样,将引用的程序集的名称添加到CompilerParameters结构中是不够的,以便编译器能够解析对Control的引用

public static void GetValue(Control control)

您必须将引用的程序集名称与using语句一起添加到脚本中,如下所示:

    using System.Drawing;
    using System.Windows.Forms;

    public class Methods
    {
        public static void GetValue(Control control)
        {
    ...

或者,如果您愿意,使用定义命名空间限定符号引用:

    public class Methods
    {
        public static void GetValue(System.Windows.Forms.Control control)
        {
    ...

顺便提一下,您可以通过检查CompileAssemblyFromSource返回的对象上的Errors属性来自行解决此类问题.

点赞