C++动态库的生成与引用


一、动态库的导出(非托管)

  1. extern "C" __declspec(dllexport) int _stdcall func(int a, int b);
    
  2. def文件(推荐),这种方式不再需要

    __declspec(dllexport)
    

    ,需要在链接–>输出–>module def中选择def文件。

二、动态库的引用

  1. 在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);
      
  2. 在C#中引用

    using System.Runtime.InteropServices;
    [DllImport("myDll.dll")]
    public static extern int func(int a, int b);
    

    引发PInvokeStackImbalance异常1


  1. C++的 “_declspec” 和 C#的 “CallingConvention=CallingConvention.Cdecl” ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值