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异常1
C++的 “_declspec” 和 C#的 “CallingConvention=CallingConvention.Cdecl” ↩︎