簡體   English   中英

C#動態加載程序集

[英]C# Loading assemblies dynamically

在運行時將文本編譯為動態對象時遇到問題。

我寫了一段簡單的代碼來編譯文本:

public class CompileFactory
{
    public dynamic Compile(String classCode, String mainClass, Object[] requiredAssemblies)
    {
        CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string, string> 
          { 
             { "CompilerVersion", "v4.0" } 
          });

        CompilerParameters parameters = new CompilerParameters
        {
            GenerateExecutable = true,       // Create a dll
            GenerateInMemory = true,          // Create it in memory
            WarningLevel = 3,                 // Default warning level
            CompilerOptions = "/optimize",    // Optimize code
            TreatWarningsAsErrors = false     // Better be false to avoid break in warnings
        };

        // Add all extra assemblies required
        foreach (var extraAsm in requiredAssemblies)
        {
            parameters.ReferencedAssemblies.Add(extraAsm as string);
        }
        CompilerResults results = provider.CompileAssemblyFromSource(parameters, classCode);
        if (results.Errors.Count != 0)
        {
            return "FAILED";
        }
        return results.CompiledAssembly.CreateInstance(mainClass); ;
    }
}

這就是我使用Compile方法的方法。

List<string> assemblies = new List<string>{"System.Net.Mail.dll", "System.Net.dll"};
dynamic obj = compile.Compile(fileText, pluginName, assemblies.ToArray()); 

正如您所看到的,我在某些時候添加了對額外程序集的引用。 出於某種原因,當我using System.Net;添加時using System.Net; 到文本文件,它不會被引用,我得到錯誤。 我正在編譯的文本字面上是一個保存為文本的.cs文件。 我想通過解壓using *並單獨添加它using *解決這個問題,但是在添加System.Net.Mail.dll ,無法找到元數據文件。

有沒有人經歷類似的事情? 我真的只想將using *添加到文件中並准備好它。 任何投入將不勝感激。

這里的問題是System.Net.dll不存在。 您可以通過右鍵單擊引用的某個位置並選擇“轉到定義”來檢查.Net類型的程序集。 這將打開一個包含類定義“from metadata”的選項卡。 在這個文件的頂部,你有一個#region顯示這個類型的來源。 對於TcpClient ,我們可以看到:

#region Assembly System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.dll
#endregion

使用“System.dll”而不是“System.Net.dll”將您的調用更改為Compile ,它應該可以正常工作

編輯/澄清:無法從using語句獲取程序集名稱。

暫無
暫無

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

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