如何在COM互操作DLL中引用WCF服务?

问题摘要 :我有一个COM interop启用/可见的C#DLL。 此C#DLL具有对WCF服务的服务引用。 当我在C#代码中实例化WCF服务时,COM互操作返回错误HRESULT(0x80131509)。

问题详情
我的解决方案中有三个组件。 第一个是非托管C ++应用程序。 此C ++应用程序需要与WCF服务进行通信。 我决定的方法是在C ++应用程序和WCF服务之间创建一个C#中间层。 C#层将是COM互操作启用/可见,以便C ++应用程序可以调用它并且C#代码将处理与WCF服务的交谈。 C ++方面永远不需要知道WCF服务; 就其而言,COM互操作呼叫将是一个黑匣子。

当我尝试在C#代码中实例化WCF服务客户端时出现问题。 为了便于测试,我在C#DLL中创建了一个Test()方法。 调用Test()只会返回一个硬编码的测试字符串。 这工作。 我能够启动C ++应用程序,它通过COM interop调用C#DLL,并返回测试字符串。 HRESULT是S_OK。 现在,如果我通过添加简单实例化WCF客户端的单行来更改Test()方法,则COM互操作调用现在返回0x80131509的HRESULT。

我唯一的线索是,当我编译C#DLL时,出现以下警告:

警告:类型库导出警告处理'[我的WCF服务]'。 警告:类型库导出器遇到从泛型类派生的类型,并且未标记为[ClassInterface(ClassInterfaceType.None)]。 类接口不能公开。 考虑使用[ClassInterface(ClassInterfaceType.None)]标记类型,并使用ComDefaultInterface属性将显式接口公开为COM的默认接口。

我不知道为什么它给我一个关于导出WCF服务类型的警告。 我希望通过使用C#中间层,它可以从C ++应用程序中隔离WCF服务的存在。

那么在COM启用/可见的DLL中使用WCF服务有什么技巧?


经过几天的痛苦之后,我们发现了一种解决方案,但它更像是一种解决方法,而不是真正的解决方案。

当我意识到尝试在C#代码中实例化WCF服务时,发现了一个线索,引发了一个异常。 在事件的C ++端捕获异常(确切地说是一个CAtlException)并查看HRESULT代码后,我确定C ++程序正在抱怨,因为它无法找到WCF服务绑定。 等等,什么? 有些不相信的是,我创建了一个.exe.config文件,并将它放在与可执行文件相同的目录中。 .exe.config文件基本上包含WCF服务项目中app.config的内容,以及system.serviceModel部分中的附加client标记,该部分包含指向WCF服务地址的单个endpoint标记。 一切工作正常,就地。

这对我来说似乎是错误的。 为什么C ++程序需要知道这一点? 只要从逻辑上思考,C#COM互操作应该将这些知识分开,并充当障碍,完全封装WCF层。 通过强制C ++程序了解底层结构,它会打败封装并使所有事情变得更加不雅观。 我完全有可能不知道COM互操作混乱的内部工作是如何工作的,所以也许这对所有人都有意义。

链接地址: http://www.djcxy.com/p/81313.html

上一篇: How do you reference a WCF service in a COM interop enabled DLL?

下一篇: Unmanaged C++ COM and Managed C++ .NET4 interop