首页 > 编程语言 >C#动态调用C/C++的DLL

C#动态调用C/C++的DLL

时间:2023-07-28 17:44:58浏览次数:124  
标签:IntPtr C# DllImport C++ DLL int Add Delegate dll

C#调用C/C++的dll有两种方式,下边就写一下两种不同方式的调用方法。

1.DllImport方式
[DllImport("CalcDll")]
public extern int Add(int a, int b);
其中CalcDll为C++动态库,Add为动态库中的方法,使用DllImport引入需要加载的DLL,使用关键字extern修饰C++库中的方法,之后正常调用即可。

2.动态加载
1.首先引入以下三个方法

[DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr LoadLibrary(string lpFileName, int h, int flags);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
private static extern IntPtr GetProcAddress(IntPtr hModule, string lProcName);
[DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)]
private static extern bool FreeLibrary(IntPtr hModule);
2.加载DLL

IntPtr m_hModule = LoadLibrary(@"D:\CalcDll.dll", 0, (int)LoaderOptimization.MultiDomain);
其中dll路径必须是全路径。

3.定义方法的委托

private delegate int Delegate_Add(int x,int y);
private Delegate_Add m_Delegate_Add;
4.动态获取该函数的委托方法对象

IntPtr func = GetProcAddress(m_hModule, “Add”);
Type t=typeof(Delegate_Add);
m_Delegate_Add=(Delegate)Marshal.GetDelegateForFunctionPointer(func, t);
其中“Add”为C++动态库中的函数名。

5.调用委托方法

int sum=m_Delegate_Add(2,3);
注意使用完之后加入析构函数,一定要释放m_hModule

~CDriver() { FreeLibrary(m_hModule); }

原文链接:https://blog.csdn.net/jh_negit/article/details/117446570

标签:IntPtr,C#,DllImport,C++,DLL,int,Add,Delegate,dll
From: https://www.cnblogs.com/wuguoqiang/p/17588532.html

相关文章

  • Asp.Net Core 集成JWT采用Rsa非对称密钥并实现自定义身份验证
    授权和鉴权分为了两个项目。首先是授权:建立Asp.netcore项目,并在Nuget包安装System.IdentityModel.Tokens.Jwt新建一个WebApi用于登录,这里使用账户密码方便调试。另外BaseResult是我封装的一个统一返回数据类型。需要注意的是audience以及JwtRegisteredClaimNames.Name......
  • C#调用C/C++动态库dll异常:对 PInvoke 函数调用导致堆栈不对称问题
    C#调用C/C++动态库dll异常:对PInvoke函数调用导致堆栈不对称问题雨渡石桥已于2023-02-2112:04:29修改973收藏1文章标签:windowsc++c#版权结论:如果你是用C#调用C的动态库,如果出现“对PInvoke函数调用导致堆栈不对称问题”,建议优先调整CallingConvention的值,建议改为Ca......
  • PowerPoint 2019 for Mac(PPT2019) v16.76 beta中文版
    PowerPoint2019mac是一款幻灯片制作软件,是 office 2019套件中的一部分。它可以帮助用户创建各种类型的演示文稿,包括商务演讲、学术报告、培训材料等等。与之前版本相比,提供了更多的功能和改进,例如更强大的演示文稿制作工具、更好的视觉效果和更加智能的助手。PowerPoint2019......
  • ChatGPT狂飙240天,欢迎来到AIGC时代!
    2023年的互联网,针对GPT的讨论已经蔚然成风,相关话题热度如火箭一般蹿升。生成式预训练模型(GenerativePre-trainedTransformer,简称GPT)是人工智能AI子领域自然语言处理中的一个重要技术,由OpenAI团队开发。GPT是一种基于互联网的、可用数据来训练的、文本生成的深度学习模型,并在不同......
  • C# 字符串转码后操作二进制文件
    String转码后写入二进制文件,读二进制文件进行解码返回。publicclassBinaryClass{///<summary>///写二进制文件///</summary>///<paramname="binFile"></param>///<paramname="str">&......
  • 【C++学习之路】引用(reference)
    变量名实质上是一段连续内存空间的别名,是一个标号,程序通过变量来申请并命名内存空间。引用的本质:就是给变量名取一个别名普通变量的引用inta=10;//定义的时候,&修饰变量为引用b就是a的别名(引用)//洗头膏不会为引用开辟空间int&b=a;//引用必须初始化系统数组的引用intarr[5]......
  • CSS隐藏滚动条
    一、纯CSS+div样式隐藏在需要滚动的元素外面再套一个div,给最外面的div设置样式overflow:hidden,宽度比需要滚动的元素小;之后给需要滚动的元素设置样式overflow-x:hidden;overflow-y:scroll;<styletype="text/css">*{margin:0;padding:0;}.box{width:100px;height:300px;......
  • 【软件测试】简易挡板测试——Mock服务搭建及使用方法
    1. Mock介绍1.1Mock简介Mock测试也被称为替代测试与挡板测试,Mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。这个虚拟的对象就是Mock对象。Mock对象就是真实对象在调试期间的代替品。形如上图,服务B就可以用Mo......
  • windows下shellcode注入的例子(WriteProcessMemory+CreateRemoteThread)
    vs里x64编译如下代码:  #include<iostream>#include<Windows.h>//#include"common.h"intmain(){ //msfvenom-pwindows/x64/execCMD=notepad.exe-fc unsignedcharshellcode[]= "\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x0......
  • cisp认证,让你在信息安全领域“风生水起”
    CISP认证CISP 即“注册信息安全专业人员”,系国家对信息安全人员资质的最高认可。英文为CertifiedInformationSecurityProfessional(简称CISP)。CISP是强制培训的。如果想参加 CISP考试,必须要求出具授权培训机构的培训合格证明,培训后直接由GLAB提供给国测中心。CISP认......