在 C++ 中使用 C# 代码

Posted

技术标签:

【中文标题】在 C++ 中使用 C# 代码【英文标题】:Using C# code in C++ 【发布时间】:2016-01-07 06:12:39 【问题描述】:

在我的一个应用程序中,我在我的 C++ 代码中调用 C# 方法。我使用了文档表格MSDN: How to call a managed DLL from native Visual C++ code in Visual Studio.NET or in Visual Studio 2005。我成功地完成了这项工作。它在我的机器上运行良好。但是,当我在另一台机器上部署相同的 C++ 代码与从 C# 创建的 .tlb 文件一起进行测试时,我的代码在“// 创建接口指针”的步骤中失败,出现未处理的异常。ICalculatorPtr pICalc(__uuidof(ManagedClass)) ;"。请同上指教。谢谢。

【问题讨论】:

您的目标机器上是否安装了所需的 .net 框架? 目标机有VS10。 我认为这行不通。您将需要用于编译 c# 代码的相同 .net 框架,而不是 Visual Studio。不需要视觉工作室 在我的机器上,我使用了相同的 VS2010 来编译 C# 代码。请指教。我需要注册 C# dll 吗? 【参考方案1】:

从您发布的链接How to call a managed DLL from native Visual C++ code in Visual Studio.NET or in Visual Studio 2005 确保您按照下面复制的步骤操作,并且它已完成且没有错误。请注意,仅部署/复制 TLB 文件是不够的,您必须将其与程序集一起实际注册到目标机器上。

注册托管 DLL 以便与 COM 或本机 C++ 一起使用

要将托管 DLL 与 COM 或本机 C++ 一起使用,您必须在 Windows 注册表中注册 DLL 的程序集信息。

为此,请按以下步骤操作: ... 5.要在 Windows 注册表中注册托管 DLL 的程序集信息并创建相应的类型库,请在 Visual Studio .NET 命令提示符处运行以下命令:

RegAsm.exe ManagedDLL.dll /tlb:ManagedDLL.tlb /codebase

【讨论】:

您好 dxiv,感谢您的回复。我已经注册了 dll,并且在我的机器中获得了 .tlb 文件。我也将相同的部署到目标机器上。请就任何进一步错过的步骤提出建议。谢谢。 @Bhavani deployed the same to the target machine 到底是什么意思?复制它们是不够的,这是重点。 你好 dxiv,我知道它不足以复制 .tlb 文件。我已经在我的机器中注册了托管 dll 并在 C++ 中使用。它工作正常。当我在另一台机器上使用 C++ dll 时,出现错误,显然是因为托管 dll 未在目标机器中注册。您能否建议一种通过代码或任何其他解决方案注册托管 dll 以使我的代码工作的方法在任何其他机器上。谢谢。 @Bhavani 正如 dxiv 所说,您必须在将其复制到的每台机器上运行 regasm,而不仅仅是您的开发机器。 你好米奇,谢谢你的评论。您能否指导我注册我的 dll 的程序(如果有)。由于在我要部署我的代码的所有机器上使用 RegAsm.exe 手动注册 dll 是不可能的,请给我一个建议。谢谢。【参考方案2】:

我发现下面的代码可以正常工作。

    SHELLEXECUTEINFO shExecInfo;

    shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    shExecInfo.fMask = NULL;
    shExecInfo.hwnd = NULL;
    shExecInfo.lpVerb = L"runas";
    shExecInfo.lpFile = L"C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\RegAsm.exe";
    shExecInfo.lpParameters = L"C:\\Test\\WebServices.dll /tlb:C:\\Test\\WebServices.tlb /codebase";
    shExecInfo.lpDirectory = NULL;
    shExecInfo.nShow = SW_NORMAL;
    shExecInfo.hInstApp = NULL;

    ShellExecuteEx(&shExecInfo);

在您的 C++ 函数中使用上述代码来自动注册托管 dll。 温柔的建议,人们来这里寻求专家的帮助,因为人们很困惑,不知道正确的道路。在这种情况下降低评级或分数并不是一项体面的工作。谢谢大家。

【讨论】:

以上是关于在 C++ 中使用 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 和 C++ 代码之间共享常量?

在单个可执行文件中组合 C# 和 C++ 代码

如何在 C# 代码中访问 C++ 类?

如何从 C++ 代码引发事件并在另一个进程的 C# 代码中调用处理程序?

性能提升:使用c#调用c++(核心代码优化)

在 C# 中使用非托管 C++ 代码对所有双精度类型返回 0