c# - 如何在启用 COM 互操作的 DLL 中引用 WCF 服务?

标签 c# wcf service com interop

问题总结:我有一个启用/可见 COM 互操作的 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 互操作调用 C# DLL,并返回测试字符串。 HRESULT 是 S_OK。现在,如果我通过添加简单实例化 WCF 客户端的 行来更改 Test() 方法,则 COM 互操作调用现在返回 0x80131509 的 HRESULT。

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

warning : Type library exporter warning processing '[my WCF service]'. Warning: Type library exporter encountered a type that derives from a generic class and is not marked as [ClassInterface(ClassInterfaceType.None)]. Class interfaces cannot be exposed for such types. Consider marking the type with [ClassInterface(ClassInterfaceType.None)] and exposing an explicit interface as the default interface to COM using the ComDefaultInterface attribute.

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

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

最佳答案

经过几天的痛苦,找到了解决方案,尽管它感觉更像是一种变通方法,而不是真正的解决方案。

当我意识到在 C# 代码中尝试实例化 WCF 服务时抛出异常时,我发现了一个线索。在捕获 C++ 方面的异常(准确地说是 CAtlException)并查看 HRESULT 代码后,我确定 C++ 程序在提示,因为它找不到 WCF 服务绑定(bind)。等等,什么?有点难以置信,我创建了一个 .exe.config 文件并将其放在与可执行文件相同的目录中。 .exe.config 文件基本上包含来自 WCF 服务项目的 app.config 的内容,加上 system.serviceModel 部分中的附加 client 标记,该标记包含一个endpoint 标记指向 WCF 服务的地址。一切正常,一切就绪。

虽然我觉得不对。为什么 C++ 程序需要知道这些?仅从逻辑上考虑,C# COM 互操作应该分离该知识并充当屏障,完全封装 WCF 层。通过强制 C++ 程序了解底层结构,它破坏了封装并使一切都变得更加……不优雅。我完全有可能不知道 COM 互操作的困惑内部是如何工作的,所以也许这对某些人来说是有意义的。

关于c# - 如何在启用 COM 互操作的 DLL 中引用 WCF 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130510/

相关文章:

Grails 数据源在服务中变为空

c# - 检查线程是否存活

javascript - 如何在没有回发的情况下发送电子邮件

.net - 在客户端请求反序列化之前和响应序列化之后 Hook 到 WCF 服务

c# - 无论我设置的间隔等待时间如何,Selenium WebDriver 都会在 60 秒时超时

wcf - 我可以拥有一个通过 SSL(使用 https)并将传输安全设置为无的 WCF 绑定(bind)吗?

c# - 如何调试 WCF 程序

android - 如何在后台使用 Android 相机?

c# - 字符串连接/覆盖?

c# - 使用 LINQ 在某个索引处连接数组?