如果您不想使用互操作,也可以利用AppDomainManager来进行一些小技巧。您可以将“主”域自动“连接”到任何域中 - 尽管我这样做的方式意味着您会放弃真实的主域。
这是执行所有操作的类:
public class PrimaryAppDomainManager : AppDomainManager
{
private static AppDomain _primaryDomain;
public static AppDomain PrimaryDomain
{
get
{
return _primaryDomain;
}
}
private void SetPrimaryDomain(AppDomain primaryDomain)
{
_primaryDomain = primaryDomain;
}
private void SetPrimaryDomainToSelf()
{
_primaryDomain = AppDomain.CurrentDomain;
}
public static bool IsPrimaryDomain
{
get
{
return _primaryDomain == AppDomain.CurrentDomain;
}
}
public static AppDomain CreateInitialDomain(string friendlyName, Evidence securityInfo, AppDomainSetup appDomainInfo)
{
if (AppDomain.CurrentDomain.DomainManager is PrimaryAppDomainManager)
return null;
appDomainInfo = appDomainInfo ?? new AppDomainSetup();
appDomainInfo.AppDomainManagerAssembly = typeof(PrimaryAppDomainManager).Assembly.FullName;
appDomainInfo.AppDomainManagerType = typeof(PrimaryAppDomainManager).FullName;
var appDomain = AppDomainManager.CreateDomainHelper(friendlyName, securityInfo, appDomainInfo);
((PrimaryAppDomainManager)appDomain.DomainManager).SetPrimaryDomainToSelf();
_primaryDomain = appDomain;
return appDomain;
}
public override AppDomain CreateDomain(string friendlyName, Evidence securityInfo, AppDomainSetup appDomainInfo)
{
appDomainInfo = appDomainInfo ?? new AppDomainSetup();
appDomainInfo.AppDomainManagerAssembly = typeof(PrimaryAppDomainManager).Assembly.FullName;
appDomainInfo.AppDomainManagerType = typeof(PrimaryAppDomainManager).FullName;
var appDomain = base.CreateDomain(friendlyName, securityInfo, appDomainInfo);
((PrimaryAppDomainManager)appDomain.DomainManager).SetPrimaryDomain(_primaryDomain);
return appDomain;
}
}
您需要稍微修改您的Main()
(应用程序入口):
static void Main(string[] args)
{
new Program().Run(args);
}
void Run(string[] args)
{
var domain = PrimaryAppDomainManager.CreateInitialDomain("PrimaryDomain", null, null);
if (domain == null)
{
}
else
{
domain.CreateInstanceAndUnwrap<Program>().Run(args);
}
}
现在,您可以随时使用
PrimaryAppDomainManager.PrimaryDomain
来获取对主域的引用,只需记住它不是由.Net运行时创建的初始域 - 而是我们立即创建的一个域。
您可以查看我
博客文章中的注释,了解一种使用app.config让.Net运行时自动为您挂钩此功能的方法。
编辑:我忘记添加我使用的扩展方法,这里它是:
public static T CreateInstanceAndUnwrap<T>(this AppDomain appDomain)
{
var res = (T)appDomain.CreateInstanceAndUnwrap(typeof(T));
return res;
}