Компиляция класса во время выполнения завершается неудачно, когда CompilerParameters.GenerateInMemory == true - PullRequest
5 голосов
/ 26 февраля 2009

Я компилирую динамическую сборку во время выполнения. Это должно ссылаться на другую DLL. Все работает хорошо, пока я устанавливаю OutputAssembly в моих 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.
}

Исключения Loader указывают, что не удалось найти "other_dll". Почему он работает, пока я не компилирую в памяти и что мне нужно сделать, чтобы он работал в памяти?

1 Ответ

5 голосов
/ 26 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...