我想知道我是否可以告诉创建对象的appdomain.这是一个单元测试,但也是有用的常识.我有以下几段代码(这是用于说明的示例代码).
public Foo Create()
{
AppDomainSetup appDomainSetup =
new AppDomainSet { ApplicationBase = @"z:\SomePath" }
AppDomain appDomain =
AppDomain.CreateDomain("DomainName", null, appDomainSetup);
return (Foo) appDomain.CreateInstanceAndUnwrap("MyAssembly", "MyClass");
}
Run Code Online (Sandbox Code Playgroud)
然后我打电话
Foo myFoo = Create();
Run Code Online (Sandbox Code Playgroud)
我想要做的是找出myFoo上的AppDomain方法将被调用,以测试Create方法实际上是否已经创建了一个新的AppDomain.我意识到我可以在Foo上添加一个方法
public class Foo
{
public string appDomainName
{
get { return AppDomain.CurrentDomain.FriendlyName; }
}
}
Run Code Online (Sandbox Code Playgroud)
这将为我提供Foo运行的应用程序.我认为这不仅仅是单元测试的优雅解决方案.如果有人可以帮助定义类似的方法,那将会很棒.
public string GetAppDomainNameWithDotNetWitchcraft(Foo myFoo)
{
// Insert voodoo here.
}
Run Code Online (Sandbox Code Playgroud)
编辑:感谢您的回复和评论.我问过的问题已经得到了解答,这些评论帮助我意识到我的错误.我真正想要实现的是测试是否创建了一个新的AppDomain.
好吧,你可以通过Remoting/Reflection做一些Spelunking,假设你完全信任.请注意,您必须访问私有属性,并且这假定它可以找到的唯一内容是由于跨应用程序域而进行远程处理:
var a = Create();
if (System.Runtime.Remoting.RemotingServices.IsTransparentProxy(a))
{
var c = System.Runtime.Remoting.RemotingServices.GetObjRefForProxy(a);
var ad = c.ChannelInfo.ChannelData[0];
var propDomainId = ad.GetType().GetProperty("DomainID", BindingFlags.NonPublic | BindingFlags.Instance);
var DomainID = propDomainId.GetValue(ad,null);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将该域ID与您自己的域名进行比较,以了解它是否在您的域中.你要知道,这是不可能的,你会进入if语句,如果它是你的域(冥思苦想的情况下,您就会有一个透明代理对象在自己的域名).