跨AppDomain调用在调用方域中执行
本文关键字:调用 执行 方域中 AppDomain | 更新日期: 2023-09-27 18:22:17
我创建一个AppDomain,在新的Domain中创建一个对象的实例,并调用一个方法,该方法返回包装对象上当前AppDomain的名称。返回的值是主程序域的名称,而不是新创建的名称。顺便说一下,该代码在VS2010中作为UnitTest执行。
知道为什么测试失败了吗?
[Serializable]
public class DomainHelper
{
public string GetDomainName()
{
return AppDomain.CurrentDomain.FriendlyName;
}
}
[TestClass]
public class DomainTests
{
[TestMethod]
public void RemoteCall()
{
var binDir = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);
const string appDomainName = "TEST";
var x = AppDomain.CreateDomain(appDomainName, null, binDir,null, false);
var remoteType = typeof(DomainHelper);
var remote = (DomainHelper) x.CreateInstanceAndUnwrap(remoteType.Assembly.FullName, remoteType.FullName);
Assert.AreEqual(appDomainName, remote.GetDomainName());
}
}
因为DomainHelper
是[Serializable]
。这意味着当它跨域时,它会在调用方的域中复制和重新创建,然后在调用方域中执行.GetDomainName
。您可以删除[Serializable]
属性并从MarshalByRefObject
派生DomainHelper
,然后在远程域中执行.GetDomainName
,或者保留[Serializable]
属性并在构造函数或初始化器中检索域名,如下所示:
[Serializable]
public class DomainHelper
{
private readonly string _domainIWasConstructedIn = AppDomain.CurrentDomain.FriendlyName;
public string GetDomainName()
{
return _domainIWasConstructedIn;
}
}
初始化器/构造函数将在远程域中执行,当对象跨域时,它设置的相关字段将被复制。