目的:是在TCP通讯的的接受消息触发时利用AppDomain程序域通过反射动态调用本地动态编译生成的一个dll,执行其中的一个方法。
问题现象:
public interface IRemoteInterface
{
object Invoke(string lcMethod, object[] Parameters);
}
/// <summary>
/// Factory class to create objects exposing IRemoteInterface
/// </summary>
public class RemoteLoaderFactory : MarshalByRefObject
{
private const BindingFlags bfi = BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance;
public RemoteLoaderFactory() { }
public IRemoteInterface Create(string assemblyFile, string typeName, object[] constructArgs)
{
return (IRemoteInterface)Activator.CreateInstanceFrom(
assemblyFile, typeName, false, bfi, null, constructArgs,
null, null, null).Unwrap();
}
}
问题1:当我自定义的RemoteLoaderFactory 不继承MarshalByRefObject时,
item._server.DataReceived += new ViewModel.NetWorkServer.LeafEvent.DataReceivedHandler(_server_OnReceive);
触发通讯_server_OnReceive TCP响应函数可以执行反射调用我的本地动态生成好的dll。但是 不继承MarshalByRefObject时,会导致AppDomain程序域无法卸载。
问题2:当我自定义的RemoteLoaderFactory 继承MarshalByRefObject时,
则在_server_OnReceive TCP响应函数执行反射调用我的本地动态生成好的dll时报错。
报错很奇怪:
`捕捉到 System.Runtime.Serialization.SerializationException
HResult=-2146233076
Message=程序集“DiagramDesigner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“MainWindow”未标记为可序列化。
Source=mscorlib
StackTrace:
Server stack trace:
在 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
在 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
提示是MainWindow未标记为可序列化,但window是不可序列化的啊。
说明下,问题2继承MarshalByRefObject,不在tcp通讯中调用而在主线程界面按钮函数中调用是不会报这个错误的。
请问我的问题在哪里,继承MarshalByRefObject的区别和在通讯响应函数中动态调用继承MarshalByRefObject的注意点。