如何在服务器端从客户端恢复System .__ ComObject状态?
问题描述:
我有客户端服务器应用程序与WCF服务,我需要发送ComObject,呈现为COM接口,在某种状态从客户端到服务器。 ComObject不可序列化,因此我需要在服务器端创建一个新实例并恢复正确的状态。如何在服务器端从客户端恢复System .__ ComObject状态?
如何获取客户端的ComObject状态并在服务器端创建接口实现实例?
定义ComObject的:COM接口的
public class SyncSessionContext
{
...
private CoreInterop.ISyncSessionState rawState;
...
}
定义
internal static class CoreInterop
{
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("b8a940fe-9f01-483b-9434-c37d361225d9")]
[ComImport]
public interface ISyncSessionState
{
[MethodImpl(MethodImplOptions.InternalCall | MethodImplOptions.PreserveSig, MethodCodeType = MethodCodeType.Runtime)]
int GetInfoForChangeApplication([MarshalAs(UnmanagedType.LPArray), In, Out] byte[] ppbChangeApplierInfo, [In, Out] ref uint pcbChangeApplierInfo);
...other methods
}
}
我的客户端代码:
public override void BeginSession(SyncProviderPosition position, SyncSessionContext syncSessionContext)
{
var field = typeof(SyncSessionContext).GetField("rawState", BindingFlags.Instance | BindingFlags.NonPublic);
// Nonserializable correct instance
var rawState = field.GetValue(syncSessionContext);
//extract state...
var state = ?????
//calling wcf service
proxy.BeginSession(position, state);
}
我的服务器端代码:
public void BeginSession(SyncProviderPosition position, object state)
{
//initializing and restoring state
var rawState = ?????
syncSessionContext = new SyncSessionContext(IdFormats(), null);
var field = typeof(SyncSessionContext).GetField("rawState", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(syncSessionContext, rawState);
KnowledgeSyncProvider.BeginSession(position, syncSessionContext);
}
答
一般来说,你不能,除非:
- 对象的COM组件类暴露序列化和反序列化它的状态,如COM接口IPersistMemory或IPersistPropertyBag的手段;或者
- 你对你的代码将要处理的每个COM coclass的内部实现有深入的了解,允许你编写代码来“手工”地序列化对象的基本状态。
这是因为拿着一个COM接口指针告诉你什么都没有公开COM对象的内部状态。国家甚至可能没有记忆。 See also.
显然,你是对的,谢谢你的评论。 – kotlyarovsa 2012-07-26 17:13:22