我有一个属性,我希望它的实例位于其他域中。
public ModuleLoader Loader
{
get
{
if(_loader == null)
_loader = (ModuleLoader)myDomain.CreateInstanceAndUnwrap(
this.GetType().Assembly.FullName,
"ModuleLoader",
false,
System.Reflection.BindingFlags.CreateInstance,
null,
null,
null,
null);
System.Diagnostics.Debug.WriteLine("Is proxy={0}",
RemotingServices.IsTransparentProxy(_loader));
//writes false
_loader.Session = this;
return _loader;
}
}
这很好用。但我假设 _loader 实例上的所有方法调用都将在其他域 (myDomain) 中调用。但是当我运行以下代码时,它仍然写入主应用程序域。
public void LoadModule(string moduleAssembly)
{
System.Diagnostics.Debug.WriteLine("Is proxy={0}",
RemotingServices.IsTransparentProxy(this));
System.Diagnostics.Debug.WriteLine(
AppDomain.CurrentDomain.FriendlyName);
System.Diagnostics.Debug.WriteLine("-----------");
}
是因为Unwrap()吗?我哪里做错了?
我了解 AppDomain 会创建单独的内存。我需要的是我的主应用程序运行,它在不同的 AppDomain 中加载模块。由于主应用程序还想观察模块的一些事件并与在单独域中运行的对象进行交互,实现它的最佳方法是什么。
最佳答案
如果你想在另一个程序集中实际运行代码,你需要让你的 ModuleLoader
类继承自 MarshalByRefObject
.如果这样做,CreateInstanceAndUnwrap()
将实际返回一个代理,调用将在另一个应用程序域中执行。
如果您不这样做,而是将类标记为 Serializable
(如异常消息所示),CreateInstanceAndUnwrap()
将在另一个中创建对象appdomain,序列化它,将序列化的形式传输到原始的appdomain,在那里反序列化并调用反序列化实例上的方法。
关于c# - CreateInstanceAndUnwrap 和域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044971/