我可以在WCF命名管道上传递COM接口吗?
我有以下COM接口:
[CoClass(typeof(ConfigViewerClass))]
[Guid("E51C677A-163B-11D4-AFE4-00902743BD1F")]
public interface ConfigViewer : IConfigViewer{}
当我尝试在WCF中将其作为返回类型传递时,我收到以下错误:
从管道读取错误:管道已经结束。 (109,0x6d)。
为什么会这样?
我尝试了以下但失败了:
[DataMember]
在c#类中定义为[DataContract]
属性'KnownType'在此声明类型上无效。它是 仅对'class,struct'声明有效。
谢谢!
答案 0 :(得分:0)
错误消息表示当客户端通道堆栈尝试从管道读取响应时,它会发现管道实例已经关闭。
您可以通过在服务端配置WCF跟踪并查看引发的异常来确认这一点,但我想在服务端通道堆栈尝试序列化时会出现故障(并因此中止管道连接)您的服务提供的实例作为返回值:它将发现对象的具体类型是RCW,它不知道如何序列化。
我不相信可以在WCF服务操作的参数或返回值中使用COM接口类型。
如果您的COM coclass公开了支持序列化和反序列化coclass实例状态的接口/方法,您可以通过定义包含ConfigViewer的纯.NET类型然后实现{{1}来解决此问题。手工封装类型上的{}或ISerializable
,使用COM方法序列化和反序列化对象状态。然后,此包装类型将用于服务操作签名,并且需要位于部署到服务器和客户端的程序集中。