C#动态加载程序集

时间:2016-06-22 12:16:58

标签: c# .net dynamic namespaces using

我在运行时将文本编译为动态对象时遇到问题。

我编写了一段简单的代码来编译文本:

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;添加到文本文件时,它将不会被引用,我会收到错误。我正在编译的文本实际上是一个保存为文本的.cs文件。我想通过提取using *并单独添加它来解决这个问题,但是在添加System.Net.Mail.dll时,无法找到元数据文件。

有没有人经历过类似的事情?我真的想将using *添加到文件中并准备好它。 任何意见都将不胜感激。

1 个答案:

答案 0 :(得分:2)

这里的问题是System.Net.dll不存在。您可以通过右键单击引用的某个位置来检查.Net类型是哪个程序集,然后选择&#34;转到定义&#34;。这将打开一个带有类定义的选项卡&#34;来自元数据&#34;。在此文件的顶部,您有#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

使用&#34; System.dll&#34;将您的通话更改为Compile而不是&#34; System.Net.dll&#34;它应该工作得很好

编辑/澄清:无法从using语句中获取程序集名称。