在运行时添加自定义类,参考丢失

时间:2013-05-28 08:43:16

标签: c# runtime .net-assembly

我正在尝试在运行时生成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还没有给出答案 - .-

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您应该引用程序集而不是命名空间。像这样:

parms.ReferencedAssemblies.Add("path_to.dll");

其中path_to.dll是包含类型Message<T>的汇编文件的路径。