2009-02-26 5 views
5

Я компилирую динамическую сборку во время выполнения. Он должен ссылаться на другую dll. Все работает нормально, пока я устанавливаю OutputAssembly в своих CompilerParameters. Но как только я установил GenerateInMemory = true; он не работает:Компиляция класса во время выполнения сбоя, когда 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. 
} 

LoaderExceptions говорят мне, что «other_dll» не удалось найти. Почему он работает до тех пор, пока я не компилирую в памяти и что мне делать, чтобы заставить его работать в памяти?

+0

И если вы жестко закодировали путь к other.dll? –

+0

Прошу прощения, путь уже жестко запрограммирован - отредактировал мое сообщение, чтобы уточнить – tanascius

ответ

5

В случае использования GenerateInMemory контекст загрузки отсутствует, сборка загружается с помощью перезагрузки Assembly.Load (Byte []). Одним из способов является временное перехват события AppDomain.AssemblyResolve, чтобы вы могли загрузить «other_dll» самостоятельно.

+0

Большое спасибо. Предлагаемое событие помогает мне решить проблему. – tanascius

+0

Здравствуйте, у меня такая же проблема, но я не могу понять, как предлагаемое событие помогает решить проблему. Показать, пожалуйста Большое спасибо –

Смежные вопросы