c++ c++/cli入门 c++如何与c#进行混合编程

落雪吖_8628

落雪吖_8628

2026-03-20

335人浏览

原创

c++ 直接调用 c# dll 失败,因原生 c++ 无法识别托管 il 字节码且未加载 clr;需用 /clr 编译的 c++/cli 作为桥梁,或通过 extern "c" 导出函数间接调用。

c++ c++/cli入门 c++如何与c#进行混合编程

为什么直接用 C++ 调用 C# DLL 会失败

因为原生 C++(即 Win32 或 MSVC 编译的 cl.exe 默认模式)根本看不懂 .NET 的 IL 字节码,也没加载 CLR 运行时。你扔一个 MyLib.dll(C# 编译出来的托管 DLL)给纯 C++ 程序,LoadLibrary 会返回 NULL,GetLastError() 很可能报 ERROR_BAD_EXE_FORMAT —— 它压根不是 Windows 认的原生 PE 格式,而是托管程序集。

常见错误现象:

  • LoadLibrary("MyCSharpLib.dll") 返回 NULL,且 GetLastError() 是 193(ERROR_BAD_EXE_FORMAT)
  • 用 #using "MyCSharpLib.dll" 编译报错:C3673: cannot take address of managed type
  • 在 C++/CLI 工程里写 System::String^ s = "hello"; 却提示未定义标识符 —— 忘了开 /clr 开关

/clr 是开关,不是语言扩展

/clr 是 MSVC 编译器的一个开关,它让 C++ 编译器生成混合模式(mixed-mode)目标文件:既有原生 x86/x64 机器码,也有 IL 元数据。没有它,C++/CLI 语法(比如 gcnew、^、%)连编译都过不去;开了它,才能在同一个 .cpp 文件里混写原生指针和托管引用。

实操建议:

  • VS 项目属性 → 配置属性 → 常规 → “公共语言运行时支持” 必须设为 /clr(不能选 /clr:pure 或 /clr:safe,它们已弃用且限制极多)
  • 所有用到托管类型(如 System::String^)或调用 C# 代码的 .cpp 文件,必须被 /clr 编译;但纯原生模块(如算法库)可保持默认 /MD,不参与混合编译
  • #using "MyCSharpLib.dll" 必须出现在 /clr 编译的源文件中,且 DLL 路径要加到“附加 #using 目录”里(项目属性 → 配置属性 → 常规 → “附加 #using 目录”)

从 C++/CLI 中调用 C# 类型的三步落地法

不是所有 C# 类都能直接拿来用。C# 端暴露的类必须满足基本互操作契约:public、有无参构造函数(或显式声明)、避免泛型类型参数跨边界(如 List<string></string> 可传,List<t></t> 不行),且最好用 [ClassInterface(ClassInterfaceType.AutoDual)] 或显式接口。

C++
C++

"空空如也"

下载

实操建议:

  • C# 项目 → 属性 → 应用程序 → “输出类型”选“类库”,勾选“为 COM 交互启用”(非必需,但能绕过部分反射限制)
  • C# 类加 [System::Runtime::InteropServices::ComVisible(true)] 特性(如果走 COM 路线),或确保是 public + public 构造函数(走 #using + IL 引用路线)
  • C++/CLI 端写法示例(假设 C# 有 namespace MyLib { public class Calculator { public int Add(int a, int b) => a + b; } }):
    #using "MyCSharpLib.dll"<br>using namespace MyLib;<br><br>int result = (gcnew Calculator())->Add(3, 4); // 注意 gcnew 和 ->

原生 C++ 怎么间接吃上 C# 的能力

如果你手头只有纯 C++ 主程序(比如 Qt 或 SDL 写的游戏引擎),又不想把它整个转成 C++/CLI(成本太高、破坏 ABI、影响第三方库链接),那就得靠中间层:用 C++/CLI 写一个“胶水 DLL”,导出纯 C 风格函数,再被原生 C++ 用 LoadLibrary + GetProcAddress 调用。

关键点:

  • C++/CLI 胶水 DLL 的导出函数必须是 extern "C" __declspec(dllexport),返回/参数只能是 int、const char*、void* 这类 C 兼容类型
  • 内部用 gcnew 创建 C# 对象,把托管对象指针转成 void* 存起来(例如用 GCHandle::Alloc 固定对象,再取 PtrToStructure)
  • 性能上,每次跨层调用都有 CLR 切换开销,别在 tight loop 里高频调用;字符串来回转换(marshal_as<:string></:string>)也耗 CPU,尽量批量传或用 UTF-16 缓冲区共享

容易被忽略的是:C++/CLI 胶水 DLL 运行时依赖 .NET Framework(如 v4.0.30319)或 .NET Core/.NET 5+ 的运行时宿主,部署时得确认目标机装了对应版本,否则 LoadLibrary 失败不是因为路径错,而是 CLR 初始化失败。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ c++入门教程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

2025.08.15

3682

7

C++桌面程序开发
C++桌面程序开发

本专题聚焦 C++ 在桌面端图形界面应用开发中的实战应用,系统讲解 Qt 框架的信号与槽机制、界面布局管理、事件响应、数据交互、样式美化与多窗口应用设计等核心知识。通过实战案例(如记事本应用、数据管理工具、系统监控面板),帮助学习者掌握 从UI设计到完整桌面软件开发的C++工程化能力。

2025.10.23

1114

13

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

2025.12.05

1341

15

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5199

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

509

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1658

6

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.04

11180

5

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

963

5

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

2025.06.11

6750

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习