2009-02-26 7 views
5

Je compile un assembly dynamique lors de l'exécution. Il doit faire référence à une autre DLL. Tout fonctionne bien, à condition de définir un OutputAssembly dans mes CompilerParameters. Mais dès que je mets GenerateInMemory = true; il échoue:La compilation d'une classe à l'exécution échoue lorsque 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. 
} 

Les LoaderExceptions me disent que "other_dll" n'a pas pu être trouvé. Pourquoi cela fonctionne-t-il tant que je ne compile pas en mémoire et que dois-je faire pour le faire fonctionner en mémoire?

+0

Et si vous codez le chemin d'accès à other.dll? –

+0

Je suis désolé, le chemin est déjà codé en dur - va éditer mon message pour clarifier – tanascius

Répondre

5

Il n'y a pas de contexte de chargement lorsque vous utilisez GenerateInMemory, l'assembly est chargé par la surcharge Assembly.Load (Byte []). Une solution de contournement consiste à temporairement accrocher l'événement AppDomain.AssemblyResolve afin que vous puissiez charger "other_dll" vous-même.

+0

Merci beaucoup. L'événement suggéré m'aide à résoudre le problème. – tanascius

+0

Bonjour, j'ai le même problème, mais je n'arrive pas à comprendre comment l'événement suggéré aide à résoudre le problème. Montrer, s'il vous plaît Merci beaucoup –

Questions connexes