如何从c+;调用用c#创建的dll文件+;项目 我有一个在C语言中创建的DLL文件,我想使用C++语言中的函数,用C++语言编写的DLL文件。 我知道在c项目中使用c#dll是可能的。但是不知道C++项目中C语言的最佳方式是什么。我正在使用visual studio 2013。您的指导是非常赞赏的。 < P>我将总结将C类通过COM公开给C++的基本步骤。假设您有以下C#类:

如何从c+;调用用c#创建的dll文件+;项目 我有一个在C语言中创建的DLL文件,我想使用C++语言中的函数,用C++语言编写的DLL文件。 我知道在c项目中使用c#dll是可能的。但是不知道C++项目中C语言的最佳方式是什么。我正在使用visual studio 2013。您的指导是非常赞赏的。 < P>我将总结将C类通过COM公开给C++的基本步骤。假设您有以下C#类:,c#,c++,.net,dll,visual-studio-2013,C#,C++,.net,Dll,Visual Studio 2013,首先,您需要为类创建一个要实现的接口。只有通过该接口公开的方法和属性对COM可见(因此对C++)。通常,此接口与类具有相同的名称,但带有“I”前缀: 接下来,您需要向接口和类添加ComVisible和Guid属性。还建议将[ClassInterface(ClassInterfaceType.None)]添加到类中: [ComVisible(true)] [Guid("71CACDF6-B6CD-4A46-B951-02E5C542852C")] public interfac

首先,您需要为类创建一个要实现的接口。只有通过该接口公开的方法和属性对COM可见(因此对C++)。通常,此接口与类具有相同的名称,但带有“I”前缀:

接下来,您需要向接口和类添加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;
}
#包括
#导入“ExampleDLL.tlb”//这是一个应该由Regasm.exe生成的文件
使用名称空间std;
使用命名空间ExampleDLL;
int main()
{
共初始化(空);
inumberpt pNumber;
pNumber.createInstance(u_uidof(Number));
pNumber->Value=5;
库特值;
返回0;
}

更多细节,参见./P>您可以使用C++ +CLI代替C++,或者您可以创建一个C++对象,并在C++中使用它。两种方式都是。。。不完美。@否决问题的人:请分享你的知识,如果你知道的话,不要否决其他问题。有了COM互操作性,这很容易。看到@AlexeiLevenkov,你认为(以及C++中COM的痛苦)实际上是OP(在谷歌上找不到这个答案)会接受的“非常简单”的东西吗?谢谢你的回答。您能告诉我[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文件添加到项目属性中,还是只使用“导入”就足够了?
[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
{
    ...
#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;
}