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

 更新时间:2025年07月14日 09:59:35   作者:追烽少年x  
在C++中调用C#编写的DLL,通常需要借助COM(技术或者通过C++/CLI来实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

相关文章

  • C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    这篇文章主要介绍了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以参考下
    2017-04-04
  • C++ String部分成员模拟实现流程详解

    C++ String部分成员模拟实现流程详解

    我们先不直接实现完整版的string,先实现简易版的string部分成员来基本了解下它的框架,以及以后来学习深浅拷贝的问题。这样有循序渐进的过程嘛
    2022-08-08
  • C语言简单实现快速排序

    C语言简单实现快速排序

    快速排序是一种不稳定排序,这篇文章主要为大家详细介绍了C语言简单实现快速排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • c++ 排查内存泄漏的妙招

    c++ 排查内存泄漏的妙招

    这篇文章主要介绍了c++ 如何用辅助类排查内存泄漏,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • Visual C++ 6.0添加一个对话框的实现步骤

    Visual C++ 6.0添加一个对话框的实现步骤

    VC6.0是微软公司推出的一款集成开发环境,本文主要介绍了Visual C++ 6.0添加一个对话框的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • C语言中feof函数和ferror函数示例详解

    C语言中feof函数和ferror函数示例详解

    在C语言中feof函数用于检查文件流的结束标志,判断文件在读取时是否已经到达了文件的末尾,这篇文章主要给大家介绍了关于C语言中feof函数和ferror函数的相关资料,需要的朋友可以参考下
    2024-09-09
  • 关于python调用c++动态库dll时的参数传递问题

    关于python调用c++动态库dll时的参数传递问题

    这篇文章主要介绍了python调用c++动态库dll时的参数传递,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C/C++之I/O性能优化过程

    C/C++之I/O性能优化过程

    C++I/O优化需禁用同步、减少刷新次数、批量处理数据,常用方法包括sync_with_stdio(false)、使用printf/scanf/fread、避免endl、stringstream缓存及文件一次性读取,针对不同场景(算法竞赛、大数据、文本处理)选择合适策略,核心是降低I/O开销与格式转换成本
    2025-09-09
  • C语言的堆串操作详解

    C语言的堆串操作详解

    大家好,本篇文章主要讲的是C语言的堆串操作详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C++有符号和无符号整数的位移操作过程

    C++有符号和无符号整数的位移操作过程

    C++中位移操作对有符号与无符号整数处理不同:无符号左移补0,右移也补0;有符号右移补符号位(算术移位),左移可能触发未定义行为,需注意类型转换与跨平台兼容性
    2025-09-09

最新评论