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

属性“KnownType”在此声明类型上无效。它仅对“类、结构”声明有效。

谢谢!

4

1 回答 1

0

该错误消息意味着当您的客户端通道堆栈尝试从管道读取响应时,它发现管道实例已经关闭。

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

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

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

于 2012-09-12T10:21:23.427 回答