C++动态库的生成与引用
一、动态库的导出(非托管)
- extern "C" __declspec(dllexport) int _stdcall func(int a, int b);
- def文件(推荐),这种方式不再需要 __declspec(dllexport) ,需要在链接–>输出–>module def中选择def文件。
二、动态库的引用
- 在C++中引用 静态加载: #pragma comment(lib,"myDll.lib") extern "C" __declspec(dllimport) int _stdcall func(int a, int b); 然后在代码在直接调用func(); 配置如下:(非常关键) 项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件testdll.h所在的目录 项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件testdll.lib所在的目录 项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“testdll.lib”(若有多个 lib 则以空格隔开) 动态加载: HINSTANCE hInst; hInst = LoadLibrary(L"myDll.dll"); typedef int(*FUNCPTR)(int a, int b); FUNCPTR myfunc = (FUNCPTR)GetProcAddress(hInst, "func"); FreeLibrary(hInst);
- 在C#中引用 using System.Runtime.InteropServices; [DllImport("myDll.dll")] public static extern int func(int a, int b); 引发PInvokeStackImbalance异常
- C++的 “_declspec” 和 C#的 “CallingConvention=CallingConvention.Cdecl”