簡體   English   中英

在運行時創建類,未找到文件異常

[英]Create Class at Runtime, File not Found Exception

即時通訊在運行時創建類時遇到問題。 每次我調試下面的代碼時,都會在var cls = results.CompiledAssembly.GetType("test.DummyHelloWorldHandler");處收到以下錯誤消息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(); 
                        } 
                    }
                }"
            };
        }

    }
}

由於錯誤的引號, GetCode返回的GetCode無法編譯。 您可以通過遍歷CompilerResultsErrors屬性來進行檢查。

您必須刪除以下行:

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

您確定您的代碼實際上可以編譯嗎? 在您的using語句后,您似乎缺少了分號。

檢查結果的Errors屬性,其中包含編譯源時遇到的錯誤。

 @"using System.Collection

應該是

 @"using System.Collections;

另外: Console.WirteLine()嗎? 嗯。 也許您應該將整個GetCode()字符串粘貼到測試程序中,使其進行編譯,然后再將其粘貼回到原始項目中。

編輯后,該文件仍無法編譯:

Console.WriteLine('Enqueued');

它在字符串周圍有單引號而不是雙引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM