以前在循环中我有一个对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属性来自行解决此类问题.