【问题标题】:How to call dll file created with c# from c++ project? [duplicate]如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]
【发布时间】: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 互操作性非常容易。见msdn.microsoft.com/en-us/library/zsfww439(v=vs.80).aspx
  • @AlexeiLevenkov 你认为 那个(以及 C++ 中 COM 的痛苦)实际上是 OP(在 Google 上找不到这个答案)会接受的“非常容易“?

标签: c# c++ .net dll visual-studio-2013


【解决方案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 就足够了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多