【问题标题】:Loading assembly which was compiled programmatically fails加载以编程方式编译的程序集失败
【发布时间】:2015-11-26 14:01:44
【问题描述】:

我们尝试在运行时编译源代码,然后将生成的程序集添加到 AppDomain。但此刻,即使加载程序集也失败了:

string sourceCode = "using System;\r\n" +
                    "public class Program1{\r\n" +
                    "   public static void Main1(){\r\n" +
                    "     int i = 100;\r\n" +
                    "   }\r\n" +
                    "}";

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
Assembly[] assembliesOfCurrentDomain = AppDomain.CurrentDomain.GetAssemblies();

for (int runAssembliesInCurrDomain = 0; runAssembliesInCurrDomain < assembliesOfCurrentDomain.Length; runAssembliesInCurrDomain++)
{
    try
    {
        parameters.ReferencedAssemblies.Add(assembliesOfCurrentDomain[runAssembliesInCurrDomain].Location);
    }
    catch
    {
    }
}

// True - memory generation, false - external file generation
parameters.GenerateInMemory = false;
parameters.OutputAssembly = "D:\\temp\\123.dll";
parameters.IncludeDebugInformation = true;
parameters.ReferencedAssemblies.Add(Assembly.GetEntryAssembly().Location);

// True - exe file generation, false - dll file generation
parameters.GenerateExecutable = false;

CompilerResults results = provider.CompileAssemblyFromSource(parameters, sourceCode);
Assembly a = Assembly.Load("D:\\temp\\123.dll");

最后一行抛出异常“在 mscorlib.dll 中发生类型为 'System.IO.FileLoadException' 的未处理异常”。我们不知道那里出了什么问题。我们尝试使用 .Net Framework 2.0 和 4.5 以及 AnyCPU、x64 和 x86 编译此代码。总是同样的问题。任何想法为什么会抛出这个异常?

【问题讨论】:

标签: c# .net .net-assembly


【解决方案1】:

您必须使用Assembly.LoadFrom 方法从路径加载。它会抛出一个不建议这样做的异常,但是这个异常在内部被捕获并且程序成功。

【讨论】:

  • 这就是问题所在。感谢您的帮助。
【解决方案2】:

您应该从MSDN article 将程序集的长名称传递给Assembly.Load。例如:

string longName = "123, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
Assembly assem = Assembly.Load(longName);

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多