dll
关于C#调用C++编译的dll库实操
托管代码与非托管代码
- 托管代码运行在CLR(公共语言运行时)上;非托管代码成机械语言运行在机器上
- 托管代码独立于语言和环境,跨平台能力强;非托管代码依赖语言和环境
- 托管代码依托于CLR(公共语言运行时),享受其提供的服务(安全检测,垃圾回收等);非托管代码需自行管理
DllImport
- 是C#调用非托管动态链接库静态入口点的特性化方法,用于修饰函数调用动态里的函数
- 关键字段EntryPoint用来明确对应动态库的函数名
- 使用System.Runtime.InteropServices命名空间
__declspec(dllexport)
- C++中导出dll中数据的关键字,用于规范输出的函数名,避免在调用时出现找不到函数的问题
遇到的问题
- C#调用函数时找不到dll中的对应函数,原因是缺少__declspec(dllexport)添加后此问题解决
- dll编译时找不到预编译文件,属性->C/C++->预编译头中可以设置预编译,但是不知道为什么pch.h没有预编译,不使用预编译头后问题解决
- 多处cpp引用pch.h时报重复声明,使用宏未能解决问题,去掉引用后问题解决,意思c语言编译问题未深究
- dll调试问题,属性->C/C++->调试,将命令路径改为执行exe路径后,dll工程设为首选项,调试即可
使用dll统一代码存在的问题
- 不能跨平台,C#中使用DllImport加载的dll受限于编译语言与编译平台,跨平台能力弱,如果要将C++变为托管代码,需要使用.net添加引用的方式,也未深究
发表回复