1

WCF サービスを使用したクライアント サーバー アプリケーションがあり、COM インターフェイスとして提示された ComObject をクライアントからサーバーに何らかの状態で送信する必要があります。ComObject はシリアル化できないため、サーバー側で新しいインスタンスを作成し、正しい状態を復元する必要があります。

クライアント側で 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);
}
4

1 に答える 1

1

一般に、次の場合を除き、できません。

  • オブジェクトの COM コクラスは、COM インターフェイスの IPersistMemory または IPersistPropertyBag など、その状態をシリアル化および逆シリアル化する手段を公開します。また
  • コードが処理するすべての COM コクラスの内部実装に関する詳細な知識があれば、オブジェクトの本質的な状態を「手動で」シリアル化するコードを記述できます。

これは、COM インターフェイス ポインターを保持しても、それを公開する COM オブジェクトの内部状態について正確には何もわからないためです。状態がメモリにない場合もあります。も参照してください。

于 2012-07-26T12:10:20.773 に答える