我正在创建一个新的沙箱AppDomain,其ApplicationBase和PrivateBinPath(例如清酒)已设置为C:\MyApp
。我正在执行的应用程序从C:\SomewhereElse
运行。
当我otherDomain.Load(...)
一个程序集时,我执行的AppDomain也在加载程序集。我通过在加载前检查GetAssemblies()
,然后在加载后检查GetAssemblies()
来确定这一点。
为什么会这样?我怀疑它与需要在执行的AppDomain中可用的元数据有关,并且它通过“Cross Boundary”从新域传回,因此调用域也正在加载程序集。但!我认为组件不能在它的ApplicationBase之外加载,除非它在GAC中,在这种情况下,它不是。
任何人都可以帮助解决我的困惑吗?
答案 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();
}