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);
}
顯然,你是對的,謝謝你的評論。 – kotlyarovsa 2012-07-26 17:13:22