如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]
Posted
技术标签:
【中文标题】如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]【英文标题】:How to call dll file created with c# from c++ project? [duplicate] 【发布时间】:2015-07-16 05:09:49 【问题描述】:我有一个用 c# 语言创建的 dll 文件。我想在 c++ 项目的 dll 文件中使用用 c# 语言编写的函数。 我知道可以将 c# dll 与 c# 项目一起使用。但不知道在 c++ 项目中执行 c# dll 的最佳方法是什么。我正在使用 Visual Studio 2013。非常感谢您的所有指导。
【问题讨论】:
您可以使用 C++/CLI 代替 C++,也可以创建一个 C# COM 对象并在 C++ 中使用它。两种方式……都不完美。 @对该问题投反对票的人:如果您知道,请分享您的知识,而不要仅仅对其他问题投反对票。 ***.com/q/19144006/2706918 使用 COM 互操作性非常容易。见msdn.microsoft.com/en-us/library/zsfww439(v=vs.80).aspx @AlexeiLevenkov 你认为 那个(以及 C++ 中 COM 的痛苦)实际上是 OP(在 Google 上找不到这个答案)会接受的“非常容易“? 【参考方案1】:我将总结通过 COM 将 C# 类公开给 C++ 的基本步骤。假设您有以下 C# 类:
public class Number
public Number()
public int Value
get;
set;
首先您需要为要实现的类创建一个接口。只有通过该接口公开的方法和属性对 COM(以及 C++)可见。通常,此接口与类同名,但带有“I”前缀:
public interface INumber
int Value
get;
set;
接下来,您需要将 ComVisible 和 Guid 属性添加到接口和类中。还建议在类中添加 [ClassInterface(ClassInterfaceType.None)]:
[ComVisible(true)]
[Guid("71CACDF6-B6CD-4A46-B951-02E5C542852C")]
public interface INumber
...
[ComVisible(true)]
[Guid("B5809A32-A066-42E3-96D7-09FE622BC994")]
[ClassInterface(ClassInterfaceType.None)]
public class Number : INumber
...
(我使用 Visual Studio 附带的 GUID 实用程序获得了 GUID。您可以在 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools 找到它)
这就是 C# 方面的内容。生成 C# DLL 后,您需要使用 Regasm.exe 命令行实用程序将其注册到 COM。启动命令提示符并键入以下命令:
“C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32”
Regasm ExampleDLL.dll /codebase /tlb
(如果你的VS安装路径不同,可能需要修改第一个。)
现在您可以像这样使用 C++ 中的 DLL:
#include <iostream>
#import "ExampleDLL.tlb" // This is a file that should have been generated by Regasm.exe
using namespace std;
using namespace ExampleDLL;
int main()
CoInitialize(NULL);
INumberPtr pNumber;
pNumber.CreateInstace(__uuidof(Number));
pNumber->Value = 5;
cout << pNumber->Value;
return 0;
更多详情请见Exposing .NET Framework Components to COM。
【讨论】:
感谢您的回答。您能说出 [Guid("71CACDF6-B6CD-4A46-B951-02E5C542852C")] 部分的用途吗?这只是一个 id 值吗? 我们是否应该将生成的 .tlb 文件添加到项目属性中? 是的,GUID 代表全局唯一标识符。 COM 中的每个类和接口都有一个与之关联的 GUID。您可以使用位于 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\guidgen.exe 的实用程序创建新的 GUID。 至于.tlb文件,不,你不需要将它添加到项目属性中。 好的,谢谢。另一个问题是我们应该将 dll 文件或 tlb 文件添加到项目属性中还是只使用 #import 就足够了?以上是关于如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
C#项目中如何调用C#写的dll中的资源文件,如 xml文件
如何通过 C# 从 C++ dll 调用 struct 中的函数