2012-07-26 73 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