2012-07-26 74 views
1

我有客户端服务器应用程序与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); 
} 

回答

1

一般来说,你不能,除非:

  • 对象的COM组件类暴露序列化和反序列化它的状态,如COM接口IPersistMemory或IPersistPropertyBag的手段;或者
  • 你对你的代码将要处理的每个COM coclass的内部实现有深入的了解,允许你编写代码来“手工”地序列化对象的基本状态。

这是因为拿着一个COM接口指针告诉你什么都没有公开COM对象的内部状态。国家甚至可能没有记忆。 See also.

+0

显然,你是对的,谢谢你的评论。 – kotlyarovsa 2012-07-26 17:13:22