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

C# 如何在启用COM互操作的DLL中引用WCF服务?,c#,wcf,service,com,interop,C#,Wcf,Service,Com,Interop,问题摘要:我有一个支持COM互操作/可见的C#DLL。此C#DLL具有对WCF服务的服务引用。当我在C代码中实例化WCF服务时,COM interop返回一个错误HRESULT(0x80131509) 问题详细信息: 我的解决方案中有三个组件。第一个是非托管C++应用程序。这个C++应用程序需要与WCF服务通信。我决定的方法是在C++应用程序和WCF服务之间建立一个C层中间层。C层是COM互操作的/可见的,这样C++应用程序就可以调用它,C代码可以处理WCF服务。C++端永远不需要知道WCF服务

问题摘要:我有一个支持COM互操作/可见的C#DLL。此C#DLL具有对WCF服务的服务引用。当我在C代码中实例化WCF服务时,COM interop返回一个错误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时,我得到以下警告:

警告:类型库导出器警告正在处理“[my WCF service]”。警告:类型库导出程序遇到一个从泛型类派生的类型,该类型未标记为[ClassInterface(ClassInterfaceType.None)]。不能为此类类型公开类接口。考虑使用[CaleFo界面(CalthTrimeType .No)]对类型进行标记,并使用CuffDebug接口属性将显式接口暴露为COM的默认接口。

我不知道为什么它会给我一个关于导出WCF服务类型的警告。我希望通过使用C中间层,可以隔离C++应用程序中WCF服务的存在。
那么,在启用COM/可见的DLL中使用WCF服务的诀窍是什么呢?

经过几天的痛苦之后,找到了一个解决方案,尽管它感觉更像是一个解决方案,而不是真正的解决方案

当我意识到试图在C代码中实例化WCF服务时,抛出了一个异常时,我发现了一个线索。在捕获C++的边(确切地说)之后,查看HESCODE代码后,我确定C++程序正在抱怨,因为它找不到WCF服务绑定。等等,什么?有点难以置信,我创建了一个.exe.config文件,并将其放在与可执行文件相同的目录中。.exe.config文件基本上包含来自WCF服务项目的app.config的内容,以及
system.serviceModel
部分中的一个额外的
client
标记,其中包含一个指向WCF服务地址的
endpoint
标记。一切都很顺利


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

您想做的绝对是可能的-您是如何创建WCF客户端的?