2009-02-26 19 views
5

Sto compilando un assembly dinamico in fase di esecuzione. Ha bisogno di fare riferimento a un'altra DLL. Tutto funziona bene, purché imposti un OutputAssembly nel mio CompilerParameters. Ma non appena ho impostato GenerateInMemory = true; fallisce:La compilazione di una classe in fase di esecuzione non riesce quando 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. 
} 

I LoaderExceptions mi stanno dicendo che "other_dll" non è stato trovato. Perché funziona finché non compilo in memoria e cosa devo fare per farlo funzionare in-memory?

+0

E se si codifica il percorso su other.dll? –

+0

Mi dispiace, il percorso è già hardcoded - modificherà il mio post per chiarire – tanascius

risposta

5

Non esiste un contesto di caricamento quando si utilizza GenerateInMemory, l'assembly viene caricato dall'assorbimento Assembly.Load (Byte []). Una soluzione alternativa consiste nell'appendere temporaneamente l'evento AppDomain.AssemblyResolve in modo da poter caricare "other_dll".

+0

Grazie mille. L'evento suggerito mi aiuta a risolvere il problema. – tanascius

+0

Ciao, ho lo stesso problema, ma non riesco a capire come l'evento suggerito aiuta a risolvere il problema. Show, per favore Grazie mille –

Problemi correlati