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

问题描述 投票:2回答:3

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

    }
}
c# class .net-assembly
3个回答
4
投票

由于错误的引号,GetCode返回的代码无法编译。您可以通过迭代ErrorsCompilerResults属性来检查。

你必须删除这一行:

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(); 
                    } 
                }
            }"
        };
}

1
投票
 @"using System.Collection

应该是

 @"using System.Collections;

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

编辑后,仍然无法编译:

Console.WriteLine('Enqueued');

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


1
投票

你确定你的代码实际上可以编译吗?在使用声明后,您似乎错过了分号。

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

© www.soinside.com 2019 - 2024. All rights reserved.