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


关于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添加引用的方式,也未深究


已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注