3

问题摘要:我有一个启用/可见 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 时,我收到以下警告:

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

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

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

4

1 回答 1

1

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

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

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

于 2013-08-12T15:10:15.800 回答