在运行时创建类,找不到文件异常

时间:2013-05-24 10:52:49

标签: c# class .net-assembly

我遇到了在运行时创建类的问题。每次调试下面的代码我都会在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(); 
                        } 
                    }
                }"
            };
        }

    }
}

3 个答案:

答案 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');

字符串周围有单引号而不是双引号。