2

パイプという名前のWCFでCOMインターフェイスを渡すことはできますか?

私は次のCOMインターフェースを持っています:

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

WCFでリターンタイプとして渡そうとすると、次のエラーが発生します。

パイプからの読み取り中にエラーが発生しました:パイプが終了しました。(109、0x6d)。

どうしてこれなの?

私は次のことを試みましたが失敗しました:

  1. TransferModeをStreamingに変更します。
  2. COMインターフェイスを次のよう[DataMember]に定義するc#クラス内としてカプセル化します。[DataContract]
  3. このCOMインターフェイスの空のインスタンスを渡します(トラフィックサイズが小さい場合)。
  4. KnowType属性の追加-COMクラスであるため、コンパイルエラーが発生します:

属性'KnownType'は、この宣言型では無効です。'class、struct'宣言でのみ有効です。

ありがとう!

4

1 に答える 1

0

このエラー メッセージは、クライアント側のチャネル スタックがパイプからの応答を読み取ろうとしたときに、パイプ インスタンスが既に閉じられていることを検出したことを意味します。

これは、サービス側で WCF トレースを構成し、発生している例外を確認することで確認できますが、サービス側のチャネル スタックがサービスのインスタンスをシリアル化しようとすると、失敗している (パイプ接続が中止されている) と思います。戻り値として提供しています。オブジェクトの具象型が RCW であり、シリアル化する方法がわからないことがわかります。

WCF サービス操作のパラメーターまたは戻り値で COM インターフェイス型を使用できるとは思えません。

COM コクラスが、コクラスのインスタンスの状態のシリアル化と逆シリアル化をサポートするインターフェイス/メソッドを公開している場合、純粋な .NET 型を定義して ConfigViewer をラップし、ラッパー型に手動でISerializableorを実装することで、これを回避できる場合があります。IXmlSerializableオブジェクトの状態をシリアル化および逆シリアル化するための COM メソッドを使用します。このラッパーの種類は、サービス操作の署名で使用され、サーバーとクライアントの両方に展開されたアセンブリに含まれている必要があります。

于 2012-09-12T10:21:23.427 に答える