我遇到了在运行时创建类的问题。每次调试下面的代码我都会在var cls = results.CompiledAssembly.GetType("test.DummyHelloWorldHandler");
收到以下错误消息无法加载文件或程序集'file:/// C:\ Users \ MyName \ AppData \ Local \ Temp \ 1ivc3qic.dll'或其中一个它的依赖关系。 Das System kann die angegebene Datei nicht finden。
每次调试程序时,* .dll文件的名称都不同
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
namespace DynamicNS
{
class Program
{
static void Main(string[] args)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.ReferencedAssemblies.Add("System.Collections.dll");
CompilerResults results = provider.CompileAssemblyFromSource(parameters, GetCode());
var cls = results.CompiledAssembly.GetType("test.DummyHelloWorldHandler");
var method = cls.GetMethod("Received", BindingFlags.Static | BindingFlags.Public);
object[] parms = { "Hallo Welt" };
method.Invoke(null, parms);
Console.ReadLine();
}
static string[] GetCode()
{
return new string[]
{
@"using System.Collections;
namespace test
{
public class DummyHelloWorldHandler
{
protected internal Queue _queue;
public void Received(string message)
{
lock (_queue)
{
_queue.Enqueue(message);
}
Console.WriteLine('Enqueued');
}
public DummyHelloWorldHandler()
{
_queue = new Queue();
}
}
}"
};
}
}
}
答案 0 :(得分:4)
由于引号错误,GetCode
返回的代码无法编译。
您可以通过迭代Errors
的{{1}}属性来检查。
您必须删除此行:
CompilerResults
并更改parameters.ReferencedAssemblies.Add("System.Collections.dll");
方法,如下所示:
GetCode()
答案 1 :(得分:1)
您确定您的代码可以实际编译吗?在使用声明后,您似乎错过了分号。
检查结果的Errors
属性,其中包含编译源代码时遇到的错误。
答案 2 :(得分:1)
@"using System.Collection
应该是
@"using System.Collections;
另外:Console.WirteLine()
?嗯。也许您应该将整个GetCode()字符串粘贴到测试程序中,使其编译,然后将其粘贴回原始项目中。
编辑完成后,仍然无法编译:
Console.WriteLine('Enqueued');
字符串周围有单引号而不是双引号。