C#调用dll文件
基本操作
dll头文件中:
extern "C" _declspec(dllexport) double _stdcall qAdd(double a, double b);
dll源文件中:
#include "test.h"
_declspec(dllexport) double _stdcall qAdd(double a, double b) {
return a + b;
}
c#代码中:
[DllImport("Win32Project1.dll")]
static extern double qAdd(double a, double b);
[DllImport("Win32Project1.dll")]
static extern double qSub(double a, double b);
//_declspec 是Microsoft VC中专用的关键字,
//配合着一些属性可以对标准的C/C++进行补充,
//应该出现在声明的前面。
//_declspec(dllexport) 声明导出函数、类、对象等供外面调用,
//作为动态库的对外接口函数、类等;
//_stdcall 被该关键字修饰的函数,其参数都是从右向左通过堆栈传递的,
//函数调用在返回前要由被调用者清理堆栈。
问题总结
错误1:视图加载格式不正确的程序
原因:可能存在多种原因,参考https://www.cnblogs.com/sundajade/articles/3735663.html
此处为vs平台造成的问题
解决方案:修改C#程序项目-属性-生成-目标平台:x64
错误2:DllNotFoundException,无法加载DLL:…
原因:缺少第三方类库,参考https://blog.csdn.net/wxnjob/article/details/73794574
解决方案:将DDS依赖的所有类库复制到C#项目目录(WindowsFormsApplication1\bin\Debug)下解决
C++调用可调用同样dll文件
基本操作
此处采用隐式链接方法调用,在C++项目中如下操作:
需要用到的文件有:.h文件、.lib文件、.dll文件
步骤为:1.添加包含目录;
2.添加库目录;
3.添加.lib依赖项或在代码中添加lib,如#pragma comment(lib,“test_dynamic.lib”) ;
4.包含.h头文件,如#include “export_dll.h”;
5.dll复制到运行目录下,同时将dll需要的依赖库复制到运行目录下。
问题总结
错误3:无法解析的外部符号,使用C++语言(补充错误,此处切换为了C++语言)调用DLL时出现
原因:猜测同错误1,vs平台造成,参考https://blog.csdn.net/qq_37979572/article/details/80085359
解决方案:同错误1,修改C++程序项目-属性-配置管理器-项目解决方案平台:x64