我可以在WCF命名管道上传递COM接口吗?

时间:2012-09-12 08:57:53

标签: c# .net wcf com named-pipes

我可以在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. 添加KnownType属性 - 导致编译错误,因为它是COM类:
  5.   

    属性'KnownType'在此声明类型上无效。它是   仅对'class,struct'声明有效。

    谢谢!

1 个答案:

答案 0 :(得分:0)

错误消息表示当客户端通道堆栈尝试从管道读取响应时,它会发现管道实例已经关闭。

您可以通过在服务端配置WCF跟踪并查看引发的异常来确认这一点,但我想在服务端通道堆栈尝试序列化时会出现故障(并因此中止管道连接)您的服务提供的实例作为返回值:它将发现对象的具体类型是RCW,它不知道如何序列化。

我不相信可以在WCF服务操作的参数或返回值中使用COM接口类型。

如果您的COM coclass公开了支持序列化和反序列化coclass实例状态的接口/方法,您可以通过定义包含ConfigViewer的纯.NET类型然后实现{{1}来解决此问题。手工封装类型上的{}或ISerializable,使用COM方法序列化和反序列化对象状态。然后,此包装类型将用于服务操作签名,并且需要位于部署到服务器和客户端的程序集中。