x0n*_*x0n 12
跨域委托仅允许具有零参数的void方法,并且它可能不是您认为的那样.它只是一个简单的回调用于从一个appdomain到另一个appdomain的通知目的,例如像InitComplete()之类的方法.
Remoting是唯一的选择,无论你是将它称为WCF还是其他任何东西,传递可序列化类型,或使用MBRO类型(MarshalByRefObjects).它并不像你想象的那么难.
-Oisin
not*_*mii 10
我刚刚发现您也可以使用AppDomain.SetData,但这只是从主机域到子域的一种方式.
static void RunInChildDomain()
{
AppDomain childDomain = AppDomain.CreateDomain("friendlyName");
string parameterValue = "notmii";
childDomain.SetData("parameter", parameterValue);
childDomain.DoCallBack(PrintName);
}
static void PrintName()
{
string Name = Convert.ToString(AppDomain.CurrentDomain.GetData("parameter"));
Console.WriteLine(Name);
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用AppDomain.FirstChanceException事件在子域和主机应用程序域之间创建异常驱动的通信:)
CallContext 允许在 AppDomains 之间传递数据:
CallContext.LogicalSetData("Key", "My value");
Console.WriteLine("{0} from {1}", CallContext.LogicalGetData("Key"),
AppDomain.CurrentDomain.FriendlyName);
var appDomain = AppDomain.CreateDomain("Worker");
appDomain.DoCallBack(() => Console.WriteLine("{0} from {1}",
CallContext.LogicalGetData("Key"),
AppDomain.CurrentDomain.FriendlyName));
AppDomain.Unload(appDomain);
CallContext.FreeNamedDataSlot("Key");
Run Code Online (Sandbox Code Playgroud)
该代码使用 System.Runtime.Remoting.Messaging。我个人没有衡量这个解决方案的性能。
归档时间: |
|
查看次数: |
20977 次 |
最近记录: |