无法从 C++ 调用 .Net 服务

Posted

技术标签:

【中文标题】无法从 C++ 调用 .Net 服务【英文标题】:Cannot Call .Net Service From C++ 【发布时间】:2011-06-06 10:27:15 【问题描述】:

我编写了一个 .NET Windows 服务,其中内置了 WCF 服务。我可以从用 Visual Studio 2010 编写的 C# 客户端调用它。但是,我还需要从用 Visual Studio 6 编写的 MFC 应用程序调用它。我添加了 COM 互操作代码来尝试实现这一点,创建了一个 snk 文件,使用regasm 注册并安装它。

WCF 服务和 MFC 应用都是 32 位的。

我的 WCF 服务接口代码如下所示

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IGASR" in both code and config file together.
[Guid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")]
[ServiceContract]
public interface IMyClass

    [OperationContract]
    void AddFile(string sFilename);


[ClassInterface(ClassInterfaceType.None)]
[Guid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)]
public class MyClass : IMyClass

    public void AddFile(string sFilename)
    
        ...
    

我的 MFC 代码如下所示:

CoInitialize(NULL);

MyNamespace::IMyClassPtr pDotNetCOMPtr;

HRESULT hRes = 
    pDotNetCOMPtr.CreateInstance(MyNamespace::CLSID_MyClass);
if (hRes == S_OK)

    pDotNetCOMPtr->AddFile ( _bstr_t(m_strFilename));


CoUninitialize ();   //DeInitialize all COM Components

但是,CreateInstance 失败,HRESULT 为 -2147221164。即该课程未注册。我错过了什么?

更新: 我将 ComVisible(true) 添加到界面上的 Guid 行,并将 /codebase 选项添加到 regasm 调用。现在,从 MFC 应用程序中,CreateInstance 成功,但对 AddFile 的调用没有执行任何操作。没有错误,但没有调用该方法。我知道这一点,因为我已经登录了该方法。此方法适用于 C# .NET 客户端。

所以,我越来越近了,但现在不明白为什么方法调用没有产生错误,但没有调用我的 .NET 服务。

有人有什么想法吗?

【问题讨论】:

【参考方案1】:

也许这会有所帮助。看起来比我想象的要复杂:)

Create WCF service for unmanaged C++ clients

祝你好运

【讨论】:

如果真的这么复杂,那我还不如把整个项目搞砸了。我目前正在做的只是一个测试应用程序。为整个项目这样做看起来就像一场维护噩梦。不过感谢您的链接。 我认为它真的归结为只是创建一个 .net dll 并使用“添加服务引用”选项来创建一个服务代理,然后从 c++ 应用程序中调用 .net dll 方法公开代理方法。我是 12 年以上的 c++ 开发人员,但在 6 年左右没有使用过 c++ ......这真是太痛苦了 :)【参考方案2】:

您是否将 C# 项目设置为在其项目构建设置中注册 COM 互操作?或者您需要运行 regasm 以手动向 COM 注册您的 .NET DLL。

【讨论】:

构建设置中 COM 互操作的注册选项是灰色的。我不知道为什么。也许这与问题有关。如果有人知道如何启用此选项,请告诉我。我手动使用了 regasm,但没有帮助。 请在问题中查看我的更新。随着 CreateInstance 成功,它现在似乎已正确注册。但是,对该方法的调用失败(没有错误,只是没有被调用)

以上是关于无法从 C++ 调用 .Net 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅仅是 DLL 文件)

无法从 .net 中的 Ajax 调用 .asmx Web 服务

从 ASP.NET MVC 项目调用 .NET CORE 5 Web API 微服务时无法检索 BadRequest 错误

无法访问显示组件 - 从 Windows 服务调用

调试从非托管 C++ 调用的托管 .NET 代码

从 C# 调用 C++ dll 函数时出现问题