# C# 调用 C++ 编译的 DLL 库实操

> 发布时间: 2026-08-02 18:25

# DLL

## 关于 C# 调用 C++ 编译的 dll 库实操

### 托管代码与非托管代码

1. 托管代码运行在 CLR（公共语言运行时）上；非托管代码成机械语言运行在机器上
2. 托管代码独立于语言和环境，跨平台能力强；非托管代码依赖语言和环境
3. 托管代码依托于 CLR，享受其提供的服务（安全检测、垃圾回收等）；非托管代码需自行管理

### DllImport

1. 是 C# 调用非托管动态链接库静态入口点的特性化方法，用于修饰函数调用动态里的函数
2. 关键字段 EntryPoint 用来明确对应动态库的函数名
3. 使用 System.Runtime.InteropServices 命名空间

### __declspec(dllexport)

1. C++ 中导出 dll 中数据的关键字，用于规范输出的函数名，避免在调用时出现找不到函数的问题

### 遇到的问题

1. C# 调用函数时找不到 dll 中的对应函数，原因是缺少 `__declspec(dllexport)`，添加后此问题解决
2. dll 编译时找不到预编译文件，属性→C/C++→预编译头中可以设置预编译，但不知道为什么 pch.h 没有预编译，不使用预编译头后问题解决
3. 多处 cpp 引用 pch.h 时报重复声明，使用宏未能解决问题，去掉引用后问题解决，意思 c 语言编译问题未深究
4. dll 调试问题，属性→C/C++→调试，将命令路径改为执行 exe 路径后，dll 工程设为首选项，调试即可

### 使用 dll 统一代码存在的问题

1. 不能跨平台，C# 中使用 DllImport 加载的 dll 受限于编译语言与编译平台，跨平台能力弱；如果要将 C++ 变为托管代码，需要使用 .net 添加引用的方式，也未深究