欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

C++项目中调用C#DLL的三种方式

2025年07月14日 C/C++
方法一:使用com技术1.在c#中创建com可见的类库在c#项目中,确保类库项目属性中的“make assembly com-visible”选项被勾选。这会为类库生成一个gu

方法一:使用com技术

1.在c#中创建com可见的类库

在c#项目中,确保类库项目属性中的“make assembly com-visible”选项被勾选。这会为类库生成一个guid,并将其注册为com组件。
例如,创建一个c#类库项目mycsharplibrary,并添加一个类myclass:
下面展示一些 内联代码片

using system;
using system.runtime.interopservices;

[comvisible(true)]
[guid("your-guid-here")]
[interfacetype(cominterfacetype.interfaceisiunknown)]
public interface imyclass
{
    void mymethod();
}

[comvisible(true)]
[guid("your-class-guid-here")]
public class myclass : imyclass
{
    public void mymethod()
    {
        console.writeline("hello from c#!");
    }
}

生成dll后,使用regasm工具将其注册为com组件:

下面展示一些 内联代码片

regasm mycsharplibrary.dll /codebase

2.在c++中调用com组件

在c++代码中,通过com接口调用c#类库中的方法:

下面展示一些 内联代码片

#include <iostream>
#import "mycsharplibrary.tlb" // 导入类型库文件

int main()
{
    coinitialize(null); // 初始化com库

    imyclassptr myclass(__uuidof(myclass)); // 创建com对象
    myclass->mymethod(); // 调用方法

    couninitialize(); // 释放com库
    return 0;
}

注意:需要确保c++项目中链接了ole32.lib和oleaut32.lib。

方法二:使用c++/cli

c++/cli是一种混合编程语言,允许在c++代码中直接使用托管代码(如c#代码)。
创建c++/cli项目
在visual studio中创建一个c++/cli项目,例如mycppcliwrapper。
在c++/cli中引用c# dll
在c++/cli项目中添加对c# dll的引用。
创建一个托管类来封装c#类的功能:
下面展示一些 内联代码片

// mycppcliwrapper.h
#pragma once

using namespace system;

public ref class mycppcliwrapper
{
public:
    void callcsharpmethod();
};
// mycppcliwrapper.cpp
#include "mycppcliwrapper.h"
#include "mycsharplibrary.h" // 引用c#类库

void mycppcliwrapper::callcsharpmethod()
{
    mycsharplibrary::myclass^ myclass = gcnew mycsharplibrary::myclass();
    myclass->mymethod();
}

3.在c++代码中调用c++/cli封装
在c++代码中调用c++/cli封装的函数:
下面展示一些 内联代码片

#include <iostream>
#include "mycppcliwrapper.h"

int main()
{
    mycppcliwrapper^ wrapper = gcnew mycppcliwrapper();
    wrapper->callcsharpmethod();
    return 0;
}

方法三:使用p/invoke(适用于c#导出非托管接口)

如果c# dll中导出了非托管接口(例如通过dllimport或[unmanagedcallersonly]),可以直接在c++中通过函数指针调用。
在c#中导出非托管接口
使用[unmanagedcallersonly]属性导出方法:
下面展示一些 内联代码片

using system;
using system.runtime.interopservices;

public class myclass
{
    [unmanagedcallersonly(entrypoint = "mymethod")]
    public static void mymethod()
    {
        console.writeline("hello from c#!");
    }
}

在c++中调用导出的函数
加载dll并获取函数指针:
下面展示一些 内联代码片

#include <iostream>
#include <windows.h>

typedef void (*mymethodfunc)();

int main()
{
    hmodule hmodule = loadlibrary("mycsharplibrary.dll");
    if (hmodule)
    {
        mymethodfunc mymethod = (mymethodfunc)getprocaddress(hmodule, "mymethod");
        if (mymethod)
        {
            mymethod();
        }
        freelibrary(hmodule);
    }
    return 0;
}

总结
com技术:适合需要跨语言调用的场景,但需要额外的注册和配置。
c++/cli:适合需要在c++中直接调用托管代码的场景,代码更简洁。
p/invoke:适合c#导出非托管接口的场景,调用方式更接近原生c++。

到此这篇关于c++项目中调用c#dll的三种方式的文章就介绍到这了,更多相关c++调用c# dll内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!