it编程 > 编程语言 > C/C++

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

22人参与 2025-07-14 C/C++

方法一:使用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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

C++ 11中lock_guard和unique_lock的区别

07-14

Alibaba Druid主要配置详解

07-14

Qt 中线程池QRunnable和QThreadPool的使用

07-14

​C++中assign函数的使用

07-14

C++中全局变量和局部变量的区别

07-14

C++ 运算符重载的使用

07-11

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论