如何从C++项目中调用使用C#创建的dll文件?

3

我有一个由C#语言创建的dll文件。我希望可以从一个C++项目中使用这个dll文件中用C#语言编写的函数。我知道在C#项目中可以使用C# DLL,但不知道在C++项目中使用C# DLL的最佳方法。 我正在使用Visual Studio 2013。非常感谢您的指导。


1
你可以使用C++/CLI代替C++,或者创建一个C# COM对象并在C++中使用它。这两种方法都不是完美的。 - nvoigt
1
https://dev59.com/SWIk5IYBdhLWcg3wkvBn - Nitinkumar Ambekar
1
通过 COM 互操作性非常容易。请参见 https://msdn.microsoft.com/zh-cn/library/zsfww439(v=vs.80).aspx。 - user1610015
如果我使用C# COM对象来创建DLL,那么会有任何性能问题吗? - Anushka Ekanayake
1
@AlexeiLevenkov,你认为那个(以及在C++中使用COM的痛苦)实际上是OP(无法在Google上找到此答案)会接受为“非常容易”的东西吗? - nvoigt
显示剩余4条评论
1个回答

2

我将总结一下通过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;
}

更多细节请参见将.NET Framework组件公开为COM对象


关于.tlb文件,不需要将其添加到项目属性中。 - user1610015
1
好的,谢谢您的提问。另一个问题是我们应该将dll文件或tlb文件添加到项目属性中,还是只需要使用“#import”就足够了呢? - Anushka Ekanayake
好的,我会尝试。感谢您宝贵的指导。 - Anushka Ekanayake
当我尝试使用上述命令生成tlb时,出现了错误。我收到了这个错误消息:"RegAsm:error RA0000:无法找到输入程序集'ExampleDLLNew.dll'或其任何依赖项。" 但是我没有使用任何依赖项。我该如何解决这个问题? - Anushka Ekanayake
我认为这不是因为依赖关系的问题,而是您错误地指定了 DLL 的名称,或者该 DLL 位于与命令提示符的当前文件夹不同的文件夹中。使用“ cd”命令更改命令提示符的当前文件夹,或指定 DLL 的完整路径(例如“ Regasm C:\ example \ ExampleDLL.dll / codebase / tlb”)。 - user1610015
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接