【问题标题】:How do you reference a WCF service in a COM interop enabled DLL?如何在启用 COM 互操作的 DLL 中引用 WCF 服务?
【发布时间】:2013-08-10 10:20:09
【问题描述】:

问题总结:我有一个 C# DLL,它支持 COM 互操作/可见。此 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 客户端的 single 行来更改 Test() 方法,COM 互操作调用现在返回 0x80131509 的 HRESULT。

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

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

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

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

【问题讨论】:

  • 你想做的事绝对有可能——你是如何创建 WCF 客户端的?

标签: c# wcf service com interop


【解决方案1】:

经过几天的苦恼,终于找到了解决方案,虽然感觉更像是一种变通方法,而不是真正的解决方案。

当我意识到尝试在 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 互操作的混乱内部是如何工作的,所以也许这对某人来说是有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多