2009-02-26 8 views
5

Ich kompiliere eine dynamische Assembly zur Laufzeit. Es muss auf eine andere DLL verweisen. Alles funktioniert gut, solange ich ein OutputAssembly in meinem CompilerParameters einstelle. Aber sobald ich GenerateInMemory = true setze; es scheitert:Kompilieren einer Klasse zur Laufzeit failes, wenn 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. 
} 

Die Loaderexceptions sagen mir, dass „other_dll“ konnte nicht gefunden werden. Warum funktioniert es, solange ich den In-Memory nicht kompiliere und was muss ich tun, damit es in-memory funktioniert?

+0

Und wenn Sie den Pfad zu other.dll fest codieren? –

+0

Es tut mir leid, der Pfad ist bereits fest codiert - wird meinen Beitrag zu klären bearbeiten – tanascius

Antwort

5

Es gibt keinen Ladekontext, wenn Sie GenerateInMemory verwenden, die Assembly wird von der Assembly.Load (Byte []) - Überladung geladen. Eine Problemumgehung besteht darin, das Ereignis AppDomain.AssemblyResolve vorübergehend anzuhängen, sodass Sie "other_dll" selbst laden können.

+0

Vielen Dank. Die vorgeschlagene Veranstaltung hilft mir, das Problem zu lösen. – tanascius

+0

Hallo, ich habe das gleiche Problem, kann aber nicht verstehen, wie das vorgeschlagene Ereignis hilft, das Problem zu lösen. Show, bitte Vielen Dank –

Verwandte Themen