2009-02-26 4 views
5

Estoy compilando un ensamblado dinámico en tiempo de ejecución. Necesita hacer referencia a otra dll. Todo funciona bien, siempre que establezca un OutputAssembly en mis CompilerParameters. Pero tan pronto como configuro GenerateInMemory = true; falla:Compilar una clase en los errores de ejecución cuando CompilerParameters.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. 
} 

Los LoaderExceptions me están diciendo que "other_dll" no se pudo encontrar. ¿Por qué funciona siempre que no compile en la memoria y qué debo hacer para que funcione en la memoria?

+0

¿Y si codifica la ruta a other.dll? –

+0

Lo siento, la ruta ya está codificada: editaré mi publicación para aclarar – tanascius

Respuesta

5

No hay contexto de carga cuando utiliza GenerateInMemory, el conjunto se carga por la sobrecarga Assembly.Load (Byte []). Una solución es enlazar temporalmente el evento AppDomain.AssemblyResolve para que pueda cargar "other_dll" usted mismo.

+0

Muchas gracias. El evento sugerido me ayuda a resolver el problema. – tanascius

+0

Hola, tengo el mismo problema, pero no puedo entender cómo el evento sugerido ayuda a resolver el problema. Mostrar, por favor Muchas gracias –

Cuestiones relacionadas