应用程序库之外的当前AppDomain加载程序集?

时间:2011-07-02 21:35:42

标签: .net assemblies clr appdomain

我正在创建一个新的沙箱AppDomain,其ApplicationBase和PrivateBinPath(例如清酒)已设置为C:\MyApp。我正在执行的应用程序从C:\SomewhereElse运行。

当我otherDomain.Load(...)一个程序集时,我执行的AppDomain也在加载程序集。我通过在加载前检查GetAssemblies(),然后在加载后检查GetAssemblies()来确定这一点。

为什么会这样?我怀疑它与需要在执行的AppDomain中可用的元数据有关,并且它通过“Cross Boundary”从新域传回,因此调用域也正在加载程序集。但!我认为组件不能在它的ApplicationBase之外加载,除非它在GAC中,在这种情况下,它不是。

任何人都可以帮助解决我的困惑吗?

1 个答案:

答案 0 :(得分:1)

为了不将第二个appdomain的程序集加载到父域中,您不能使用otherdomain.Load(...)。您必须在子appDomain中创建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();    
}