[英]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
無法編譯。 您可以通過遍歷CompilerResults
的Errors
屬性來進行檢查。
您必須刪除以下行:
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.