.net core webapi 列表返回指定的字段_VB.NET动态静态加载Win32 C++ DLL并调用API函数优雅方法总结...

本文介绍了在VB.NET中如何优雅地实现.NET Core WebAPI与C++ DLL的交互,包括静态加载和动态加载两种方式。静态加载时,通过Declare或DllImport方法声明函数,需要注意函数原型和路径。动态加载则利用LoadLibraryW和GetProcAddress,通过委托类型巧妙地调用函数指针。文中强调了避免使用CallWindowProc和反射,提供了一种独特而简洁的方法。
摘要由CSDN通过智能技术生成

80976f33e1db50b7447577c09a66a45d.png

本文亮点:无需使用反射,无需动态生成方法,无需CallWindowProc!

本文毒点:如果你不知道要调用的API函数原型(函数名、参数类型、返回值类型),本文不能帮助你,建议关注API Monitor、反向工程等话题。

静态加载

所谓静态加载,是指你在编码时就知道DLL文件的位置,用户有义务保证运行时可以在那个固定的、不允许变更的位置找到DLL文件。这种情况可以使用简单的静态调用。

静态调用十分简单,官网文档就有详解,但是出于完整性考虑还是在这里解说一下。

Imports System.Runtime.InteropServices
'方法1:使用Declare语句声明调用kernel32.dll中的LoadLibraryW函数,该函数接受一个LPWStr类型的String参数,返回一个IntPtr
Declare Function LoadLibraryW Lib "kernel32.dll" (<MarshalAs(UnmanagedType.LPWStr)> Dll路径 As String) As IntPtr
'方法2:使用DllImport特性声明调用kernel32.dll中的GetProcAddress函数,该函数在本程序集中被改名为Fg_InitLibrariesExGpa,接受一个IntPtr和一个String参数,返回IntPtr
<DllImport("kernel32.dll", BestFitMapping:=False, EntryPoint:="GetProcAddress")> Function Fg_InitLibrariesExGpa(Dll指针 As IntPtr, Api名称 As String) As IntPtr
End Function

最典型的两种静态加载调用的方法:

  • Declare Function/Sub 函数名 Lib DLL路径 Alias 入口点 (参数列表) As 返回类型。如果指定Sub则必须去掉As 返回类型。这是一种比较简单的声明方法,但是无法实现某些特殊功能。如果在Public类或模块中声明,应当加上Private访问限制。如果参数列表中有String,应当用MarshalAs特性注明函数原型接受的是LPWStr还是LPStr。参数类型是重要的,参数名称可以任意。如果你声明的函数名就是其原名,Alias 入口点可以省略。
  • <DllImport(DLL路径, 其它属性列表)>一般的函数声明。这是一种复杂的声明方法,可以实现一些高级功能。例子中指定了BestFitMapping字段࿰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值