Настройка обработчика исключений для AppDomain.AssemblyResolve - PullRequest
1 голос
/ 03 августа 2009

Создайте новый домен приложения, настройте обработчик AssemblyResolve и вы всегда получаете исключение, говорящее «сборка [текущая исполняющая сборка] не найдена»

что дает? код ниже

string _fileName = @"c:\temp\abc123.dll";

AppDomain sandBox = AppDomain.CreateDomain("sandbox");

sandBox.AssemblyResolve += new ResolveEventHandler(sandBox_AssemblyResolve); 
// the line generates the exception !

System.Reflection.Assembly asm = sandBox.Load(System.Reflection.AssemblyName
                                     .GetAssemblyName(fileName).FullName);

foreach (System.Reflection.AssemblyName ar in asm.GetReferencedAssemblies())
    dbgWrite("Ref:  " + ar.FullName );


System.Reflection.Assembly sandBox_AssemblyResolve
  (object sender, ResolveEventArgs e)
{

    System.Reflection.Assembly asm = 
        System.Reflection.Assembly.LoadFrom(_fileName);
    return asm;

}

Исключение составляет:

System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'appAdmin, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null' или одна из ее зависимостей Система не может найти указанный файл. Имя файла: 'appAdmin, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null' [снип]

Ответы [ 2 ]

1 голос
/ 03 сентября 2009

Ваш распознаватель может не сработать на вашем новом домене приложений, попробуйте вместо этого установить его на домене приложений. ДоменAppDomain.

AppDomain.CurrentDomain.AssemblyResolve + = новый ResolveEventHandler (sandBox_AssemblyResolve);

В методе sandBox_AssemblyResolve вы можете загрузить сборку из любых каталогов, которые вам нравятся, именно здесь может сыграть нагрузка из байта [].

Что касается загрузки сборки с использованием байта [], это устраняет проблемы с блокировкой файлов, но не исправит то, что вам не кажется. здесь

1 голос
/ 24 августа 2009

Вы пытаетесь загрузить сборки, которые не находятся в базовом расположении домена приложения. У меня никогда не было события AssemblyResolve для меня.

Я бы предложил загрузить вашу сборку вне базы в байтовый массив (System.IO.File.ReadAllBytes), а затем передать этот массив в только что созданный вами домен приложений для загрузки .

...