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

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 添加引用的方式,也未深究
📥 导出 Markdown