如何从 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++ Dll,并从 C# 调用它

C#项目中如何调用C#写的dll中的资源文件,如 xml文件

从 c# 调用 c++ 库

如何通过 C# 从 C++ dll 调用 struct 中的函数

如何从 C 代码正确创建 DLL 并在 C++ 项目中使用它

使用非托管 C++ .dll 从 C# .exe 调用函数