当CompilerParameters.GenerateInMemory == true时,在运行时编译一个类失败

时间:2009-02-26 18:22:49

标签: c# reflection

我正在运行时编译动态程序集。它需要引用另一个dll。只要我在CompilerParameters中设置了OutputAssembly,一切正常。但是一旦我设置了GenerateInMemory = true;它失败了:

var compilerParameters = new CompilerParameters();
if( compileInMemory )
    compilerParameters.GenerateInMemory = true;
else
    compilerParameters.OutputAssembly = "<my_dynamic_dll_path>";
compilerParameters.ReferencedAssemblies.Add( "<other_dll_path>" );
var compilerResults = new CSharpCodeProvider().CompileAssemblyFromDom( compilerParameters, codeCompileUnit );

// Here: compilerResults.Errors.HasErrors == false

foreach( var type in compilerResults.CompiledAssembly.GetTypes() )
{
     // Exception:
     // Unable to load one or more of the requested types.
     // Retrieve the LoaderExceptions property for more information.
}

LoaderExceptions告诉我找不到“other_dll”。为什么只要我不在内存中编译就可以工作,为了让它在内存中工作,我该怎么办呢?

1 个答案:

答案 0 :(得分:5)

使用GenerateInMemory时没有加载上下文,程序集由Assembly.Load(Byte [])重载加载。一种解决方法是暂时挂钩AppDomain.AssemblyResolve事件,以便您自己加载“other_dll”。