2012-09-12 64 views
2

我可以在WCF命名管道上傳遞COM接口嗎?我可以在WCF命名管道上傳遞COM接口嗎?

我有以下的COM接口:

[CoClass(typeof(ConfigViewerClass))] 
[Guid("E51C677A-163B-11D4-AFE4-00902743BD1F")] 
public interface ConfigViewer : IConfigViewer{} 

當我試圖把它作爲返回類型在我的WCF,我發現了以下錯誤:

There was an error reading from the pipe: The pipe has been ended. (109, 0x6d).

這是爲什麼?

我嘗試以下,但失敗:

  1. 變化TransferMode到流。
  2. 封裝定義爲這個COM接口的[DataContract]
  3. 通行證空instace(用於較小的流量尺寸)C#類內的COM接口[DataMember]
  4. 添加KnownType屬性 - 導致編譯錯誤,因爲它COM類:

Attribute 'KnownType' is not valid on this declaration type. It is only valid on 'class, struct' declarations.

謝謝!

+0

來自tracer的任何有用信息? – Reniuz

+0

@Reniuz恐怕不是.. –

+0

將所有KnownTypes添加到您的服務接口? – Reniuz

回答

0

錯誤消息意味着當您的客戶端通道堆棧嘗試從管道讀取響應時,它會發現管道實例已經關閉。

您可以通過在服務端配置WCF跟蹤並查看正在引發什麼異常來確認這一點,但我想象服務端通道堆棧在嘗試序列化時失敗(並因此中止管道連接)你的服務提供的實例作爲返回值:它會發現對象的具體類型是一個RCW,它不知道如何序列化。

我不認爲有可能在WCF服務操作的參數或返回值中使用COM接口類型。

如果你的COM組件類公開的接口/方法支持序列化和deserializng共類的一個實例的狀態,您可以通過定義一個純粹的.NET類型包裹ConfigViewer,然後實施ISerializableIXmlSerializable解決此手動封裝類型,使用COM方法對對象狀態進行序列化和反序列化。這個包裝類型將被用在服務操作簽名中,並且需要在部署到服務器和客戶端的程序集中。