SHR*_*HRI 6 appdomain .net-4.0 applicationdomain c#-4.0
请考虑以下代码:
// Create a new application domain
AppDomain ad = AppDomain.CreateDomain("New domain");
Worker work = new Worker();
// if Worker class is marked as 'MarshalByRefObject', this will run in current
// appdomain.
// if Worker class is NOT marked as 'MarshalByRefObject' and is marked as
// 'Serializable', this will run in a new appdomain.
ad.DoCallBack(work.PrintDomain);
// or ad.DoCallBack(new CrossAppDomainDelegate(work.PrintDomain));
// But for static methods:
// If ppp method is static, no marking is required and it will run in
// a new AppDomain.
ad.DoCallBack(Worker.ppp);
Run Code Online (Sandbox Code Playgroud)
我们如何解释这种行为DoCallBack
?
PrintDomain
当Worker
标记类时,为什么在当前域中执行非静态方法MarshalByRefObject
?PrintDomain
在Worker
标记类时,在新的AppDomain中执行非静态方法Serializable
?当Worker类标记为MarshalByRefObject时,为什么在当前域中执行非静态方法PrintDomain?
因为这是MBRO所做的,它会为您在主应用程序域中创建的对象创建代理.其中将来自辅助应用程序域的调用编组到拥有该对象(主应用程序域)的应用程序域.
当Worker类标记为Serializable时,为什么在新的AppDomain中执行非静态方法PrintDomain?
因为那情景就不能使用代理.对象本身从主应用程序域到辅助应用程序域进行编组.可能是因为您将其标记为[可序列化].因此,调用在辅助appdomain中执行.
为什么静态方法不需要任何标记?
目前还不清楚"标记"是什么意思,但静态方法没有任何不同.一些代码可以使用,删除基类上的注释来比较两个场景:
using System;
class Program {
static void Main(string[] args) {
var dom = AppDomain.CreateDomain("Test");
var obj = new WorkerMbro();
dom.DoCallBack(obj.PrintDomain);
dom.DoCallBack(obj.PrintDomainStatic);
Console.ReadLine();
}
}
[Serializable]
class WorkerMbro /* : MarshalByRefObject */ {
public void PrintDomain() {
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
}
public void PrintDomainStatic() {
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
}
}
Run Code Online (Sandbox Code Playgroud)
发布的输出:
Test
Test
Run Code Online (Sandbox Code Playgroud)
输出删除了注释,以便使用代理:
ConsoleApplication1.vshost.exe
ConsoleApplication1.vshost.exe
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3099 次 |
最近记录: |