我正在尝试在运行时生成Code,它使用另一个命名空间中的自定义类。
这是我的代码:
namespace Test.Programm.Network
{
class Handler
{
public void CreateAssembly()
{
string[] code =
{
@"using System;
using System.Collections;
namespace Test.Programm.Network
{
class HandleMessage
{
protected static internal Queue _queue;
public static void Received(string message)
{
lock (_queue)
{
_queue.Enqueue(message);
}
}
public HandleMessage()
{
_queue = new Queue();
}
}
}"
};
CompilerParameters parms = new CompilerParameters();
parms.GenerateExecutable = false;
parms.GenerateInMemory = true;
CodeDomProvider compiler = null;
compiler = CodeDomProvider.CreateProvider("CSharp");
CompilerResults compilerResults = compiler.CompileAssemblyFromSource(parms, code);
var cls = compilerResults.CompiledAssembly.GetType("Test.Programm.Network.HandleMessage");
Assembly assembly = compilerResults.CompiledAssembly;
var newHandler = assembly.CreateInstance(compilerResults.CompiledAssembly.GetType("Test.Programm.Network.HandleMessage").ToString());
}
}
}
但我不想将字符串传递给我的函数,我想将自己的类型传递给该函数。
现在我有一个类似的简单消息类:
namespace Test.Programm.Messages
{
public class Message<T>
{
string _message;
}
}
如果我想在我想要生成的代码中添加一个使用Test.Programm.Messages,我得到的错误是这个Namespace不存在,缺少引用......
我尝试添加parms.ReferencedAssemblies.Add(“Grid.Node.Messages”);代码生成,但这不起作用。在网上搜索,SO还没有给出答案 - .-
感谢您的帮助。
答案 0 :(得分:0)
您应该引用程序集而不是命名空间。像这样:
parms.ReferencedAssemblies.Add("path_to.dll");
其中path_to.dll
是包含类型Message<T>
的汇编文件的路径。