Загрузка сборок с зависимостями в другой домен приложения

Моя цель - выполнить проверку отсутствующих зависимостей между двумя заданными папками. Представьте себе следующую настройку.

Root\Dira \A.DLL

Root\DIRB \ B.dll

B зависит от A.

Поэтому, учитывая эти папки, я хочу создать новый домен приложений, загрузить B.dll и автоматически разрешить и изолировать зависимость от DirA(A.dll) и изолировать в этом новом домене приложений.

Изоляция является ключевой здесь, учитывая, что когда я выгружаю этот домен приложений, я хочу снова создать новый с потенциально DirA в качестве зависимости, но библиотекам DirC, которые этого требуют, так что в случае, если DirC также имеет зависимость от DirB, я хочу, чтобы он выбрасывал исключение.

Изменить: Добавление примера кода на случай, если это поможет лучше описать мой вопрос.

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = @"C:\Root";
setup.ApplicationName = "Isolated Domain"
setup.PrivateBinPath = @"DirA;DirB";
setup.PrivateBinPathProbe = "";//disable search in AppBase..
var domain = AppDomain.CreateDomain(Guid.NewGuid().ToString(),
                                    AppDomain.CurrentDomain.Evidence,
                                    setup,
                                    AppDomain.CurrentDomain.PermissionSet);
//The following statement in theory should pick B.dll's dependency from DirA.
var assembly = domain.Load(AssemblyName.GetAssemblyName(@"C:\Root\DirB\B.dll").Name);
//Do the same in a different domain for C.dll

Спасибо за любую помощь в этом.

2 ответа

Это похоже на работу для ResolveEventHandler (более подробно на MSDN относительно разрешения неизвестных сборок)

Итак, вы можете написать что-то вроде

class MyResolver
{
  public static Assembly MyResolveEventHandler( Object sender, ResolveEventArgs args )
  {
    // confirm args.Name contains A.dll
    String dllName = args.Name.Split({','}, SplitStringOptions.None)[0];
    if (dllName == "A")
    {
      return Assembly.LoadFile(@"C:\Root\DirA\A.dll")
    }
    return null;
  }
}

и в домене, который вы создали, вы должны сделать:

domain.AssemblyResolve += new ResolveEventHandler(MyResolver.MyResolveEventHandler);

Убедитесь, что вы связали событие, прежде чем ссылаться на A в B.

AppDomain не может обнаружить DLL вне их начальной папки. Они могут исследовать GAC и PrivateBinPath глубже в папку, но они не могут исследовать другие папки.

Другие вопросы по тегам