Текущая AppDomain загружает сборки за пределами базы приложения? - PullRequest
2 голосов
/ 03 июля 2011

Я создаю новый AppDomain для песочницы, для которого ApplicationBase и PrivateBinPath (например, ради) были установлены на C:\MyApp. Мое исполняемое приложение запущено с C:\SomewhereElse.

Когда я otherDomain.Load(...) сборка, мой исполняемый AppDomain также загружает сборку. Я определяю это, проверяя GetAssemblies() перед загрузкой, а затем также GetAssemblies() после загрузки.

Почему это происходит? Я подозреваю, что это как-то связано с метаданными, которые должны быть доступны в исполняемом домене приложений, и он передается обратно из нового домена через «Cross Boundary», поэтому вызывающий домен также загружает сборку. Но! Я думал, что сборка не может быть загружена за пределы ее ApplicationBase, если только она не находится в GAC, а в данном случае это не так.

Может кто-нибудь помочь с моим замешательством?

1 Ответ

1 голос
/ 12 июня 2012

Чтобы не загружать сборки второго домена приложения в родительский домен, нельзя использовать otherdomain.Load (...).Вы должны создать MarshalByRefObject в дочернем домене приложения, и этот код вызывает AppDomain.Load (...).

Пример:

public class AppDomainInitializer : MarshalByRefObject
{
  public void Initialize() { AppDomain.Load(...); }
}

Родительский домен:

{
AppDomain otherDomain = AppDomain.CreateDomain(...);

// Create the object in the other domain
ObjectHandle oh = Activator.CreateInstance(otherDomain, assemblyNme, "AppDomainInitializer", ...);

// Marshall it to this domain
var initializer = (AppDomainInitializer) oh.UnWrap();

// Proxy the call to load up the other domain dll's
intializer.Initialize();    
}
...