C# 如何从服务器端的客户端恢复系统.\uuuu ComObject状态?

C# 如何从服务器端的客户端恢复系统.\uuuu ComObject状态?,c#,wcf,com,C#,Wcf,Com,我有一个带有WCF服务的客户机-服务器应用程序,我需要在某种状态下从客户机到服务器发送COM对象(显示为COM接口)。ComObject不可序列化,因此我需要在服务器端创建一个新实例并恢复正确的状态 如何在客户端获取此ComObject状态并在服务器端创建接口实现实例? 共对象的定义: public class SyncSessionContext { ... private CoreInterop.ISyncSessionState rawState; ... } COM接口的定

我有一个带有WCF服务的客户机-服务器应用程序,我需要在某种状态下从客户机到服务器发送COM对象(显示为COM接口)。ComObject不可序列化,因此我需要在服务器端创建一个新实例并恢复正确的状态

如何在客户端获取此ComObject状态并在服务器端创建接口实现实例?

共对象的定义:

public class SyncSessionContext
{
  ...
  private CoreInterop.ISyncSessionState rawState;
  ...
}
COM接口的定义

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);
}
我的服务器端代码:

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类的内部实现都有深入的了解,允许您编写代码“手动”序列化对象的基本状态

这是因为持有COM接口指针并不确切地告诉您公开它的COM对象的内部状态。该状态甚至可能不在内存中

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

  • 对象的COM类公开了序列化和反序列化其状态的方法,例如COM接口IPersistMemory或IPersistPropertyBag;或
  • 您对代码将要处理的每个COM类的内部实现都有深入的了解,允许您编写代码“手动”序列化对象的基本状态
这是因为持有COM接口指针并不确切地告诉您公开它的COM对象的内部状态。该状态甚至可能不在内存中