2

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

    }
}
4

3 回答 3

4

由于引号错误,返回的代码GetCode无法编译。Errors您可以通过遍历CompilerResults.

您必须删除此行:

parameters.ReferencedAssemblies.Add("System.Collections.dll");

并像这样更改GetCode()方法:

private static string[] GetCode()
{
  return new string[]
        {
          @"using System;
            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(); 
                    } 
                }
            }"
        };
}
于 2013-05-24T11:05:52.367 回答
1

您确定您的代码实际上可以编译吗?您的 using 语句后似乎缺少一个分号。

检查Errors结果的属性,它包含编译源代码时遇到的错误。

于 2013-05-24T10:56:34.957 回答
1
 @"using System.Collection

应该是

 @"using System.Collections;

还有:Console.WirteLine()?嗯。也许您应该将整个 GetCode() 字符串粘贴到测试程序中,使其编译,然后将其粘贴回您的原始项目中。

编辑后,这仍然无法编译:

Console.WriteLine('Enqueued');

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

于 2013-05-24T10:57:16.850 回答