问题摘要:我有一个启用/可见 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 服务的技巧是什么?