游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

C调用动态链接库DLL平台之间调用

  本编所涉及到的工具以及框架:1、VisualStudio20222、。net6。0PInvok是什么?PInvoke全称为PlatformInvoke(平台调用),其实际上就是一种函数调用机制,通过PInvoke就可以实现调用非托管Dll中的函数。在开始之前,我们首先需要了解C中有关托管与非托管的区别托管(Collocation),即在程序运行时会自动释放内存;非托管,即在程序运行时不会自动释放内存。废话不多说,直接实操第一步:打开VS2022,新建一个C控制台应用右击解决方案,添加一个新建项,新建一个动态链接库(DLL),新建完之后需要右击当前项目属性CC预编译头选择不使用编译头在新建的DLL中我们新建一个头文件,用于编写我们的方法定义,然后再次新建一个C文件,后缀以。c结尾第二步:在我们DLL中的头文件(Native。h)中定义相关的Test方法,具体代码如下:pragmaonce定义一些宏ifdefcplusplusdefineEXTERNexternCelsedefineEXTERNendifdefineCallingConventioncdecl判断用户是否有输入,从而定义区分使用dllimport还是dllexportifdefDLLIMPORTdefineHEADEXTERNdeclspec(dllimport)elsedefineHEADEXTERNdeclspec(dllexport)endifHEADintCallingConventionSum(inta,intb);之后需要去实现头文件中的方法,在Native。c中实现,具体实现如下:includeNative。h导入头部文件includestdio。hHEADintAdd(inta,intb){returnab;}在这些步骤做完后,可以尝试生成解决方案,检查是否报错,没有报错之后,将进入项目文件中,检查是否生成DLL(。。x64Debug)第三步:在这里之后,就可以在C中去尝试调用刚刚所声明的方法,以便验证是否调用DLL成功,其具体实现如下:usingSystem。Runtime。InteropServices;classProgram{〔DllImport(C:MyprojectCCallCCSharpPInvokeDlldDebugNativeDll。dll)〕publicstaticexternintAdd(inta,intb);publicstaticvoidMain(string〔〕args){intsumAdd(23,45);Console。WriteLine(sum);Console。ReadKey();}}
  运行结果为:68,证明我们成功调用了DLL动态链库C中通过PInvoke调用DLL动态链库的流程
  通过上述一个简单的例子,我们大致了解到了在C中通过PInvoke调用DLL动态链库的流程,接下我们将对C中的代码块做一些改动,便于维护在改动中我们将用到NativeLibrary类中的一个方法,用于设置回调,解析从程序集进行的本机库导入,并实现通过设置DLL的相对路径进行加载,其方法如下:publicstaticvoidSetDllImportResolver(System。Reflection。Assemblyassembly,System。Runtime。InteropServices。DllImportResolverresolver);在使用这个方法前,先查看一下其参数a、assembly:主要是获取包含当前正在执行的代码的程序集(不过多讲解)
  b、resolber:此参数是我们要注重实现的,我们可以通过查看他的元代码,发现其实现的是一个委托,因此我们对其进行实现。
  原始方法如下:publicdelegateIntPtrDllImportResolver(stringlibraryName,Assemblyassembly,DllImportSearchPath?searchPath);实现resolver方法:conststringNativeLibNativeDll。dll;staticIntPtrDllImportResolver(stringlibraryName,Assemblyassembly,DllImportSearchPath?searchPath){stringdllPath。Combine(newDirectoryInfo(Environment。CurrentDirectory)。Parent。Parent。Parent。Parent。ToString(),x64,Release,NativeDll。dll);此处为Dll的路径Console。WriteLine(dll);returnlibraryNameswitch{NativeLibNativeLibrary。Load(dll,assembly,searchPath),IntPtr。Zero};}该方法主要是用于区分在加载DLL时不一定只能是设置绝对路径,也可以使用相对路径对其加载,本区域代码是通过使用委托去实现加载相对路径对其DLL加载,这样做的好处是,便于以后需要更改DLL的路径时,只需要在这个方法中对其相对路径进行修改即可。更新C中的代码,其代码如下:usingSystem。Reflection;usingSystem。Runtime。InteropServices;classProgram{conststringNativeLibNativeDll。dll;〔DllImport(NativeLib)〕publicstaticexternintAdd(inta,intb);staticIntPtrDllImportResolver(stringlibraryName,Assemblyassembly,DllImportSearchPath?searchPath){stringdllPath。Combine(newDirectoryInfo(Environment。CurrentDirectory)。Parent。Parent。Parent。Parent。ToString(),x64,Release,NativeDll。dll);Console。WriteLine(dll);returnlibraryNameswitch{NativeLibNativeLibrary。Load(dll,assembly,searchPath),IntPtr。Zero};}publicstaticvoidMain(string〔〕args){NativeLibrary。SetDllImportResolver(Assembly。GetExecutingAssembly(),DllImportResolver);intsumAdd(23,45);Console。WriteLine(sum);Console。ReadKey();}}最后重新编译,检查其是否能顺利编译通过,最终我们的到的结果为:68至此,我们就完成了一个简单的C调用动态链接库的案例
  下面将通过一个具体实例,讲述为什么要这样做?(本实例通过从性能方面进行对比)在DLL中的头文件中,加入如下代码:HEADvoidCBubbleSort(intarray,intlength);在。c文件中加入如下代码:HEADvoidCBubbleSort(intarray,intlength){inttemp0;for(inti0;ilength;i){for(intji1;jlength;j){if(array〔i〕array〔j〕){temparray〔i〕;array〔i〕array〔j〕;array〔j〕temp;}}}}C中的代码修改:
  usingSystem。Diagnostics;usingSystem。Reflection;usingSystem。Runtime。InteropServices;classProgram{conststringNativeLibNativeDll。dll;〔DllImport(NativeLib)〕publicunsafestaticexternvoidCBubbleSort(intarr,intlength);staticIntPtrDllImportResolver(stringlibraryName,Assemblyassembly,DllImportSearchPath?searchPath){stringdllPath。Combine(newDirectoryInfo(Environment。CurrentDirectory)。Parent。Parent。Parent。Parent。ToString(),x64,Release,NativeDll。dll);Console。WriteLine(dll);returnlibraryNameswitch{NativeLibNativeLibrary。Load(dll,assembly,searchPath),IntPtr。Zero};}publicunsafestaticvoidMain(string〔〕args){intnum1000;int〔〕arrnewint〔num〕;int〔〕cSharpResultnewint〔num〕;随机生成num数量个(010000)的数字RandomrandomnewRandom();for(inti0;iarr。Length;i){arr〔i〕random。Next(10000);}利用冒泡排序对其数组进行排序StopwatchswStopwatch。StartNew();Array。Copy(arr,cSharpResult,arr。Length);cSharpResultBubbleSort(cSharpResult);Console。WriteLine(34;C实现排序所耗时:{sw。ElapsedMilliseconds}ms);调用Dll中的冒泡排序算法NativeLibrary。SetDllImportResolver(Assembly。GetExecutingAssembly(),DllImportResolver);fixed(intptrarr〔0〕){sw。Restart();CBubbleSort(ptr,arr。Length);}Console。WriteLine(34;C实现排序所耗时:{sw。ElapsedMilliseconds}ms);Console。ReadKey();}冒泡排序算法publicstaticint〔〕BubbleSort(int〔〕array){inttemp0;for(inti0;iarray。Length;i){for(intji1;jarray。Length;j){if(array〔i〕array〔j〕){temparray〔i〕;array〔i〕array〔j〕;array〔j〕temp;}}}returnarray;}}执行结果:C实现排序所耗时:130msC实现排序所耗时:3ms在实现本案例中,可能在编译后,大家所看到的结果不是很出乎意料,但这只是一种案例,希望通过此案例的分析,能给大家带来一些意想不到的收获叭。最后
  简单做一下总结叭,通过上述所描述的从第一步如何创建一个DLL到如何通过C去调用的一个简单实例,也应该能给正在查阅相关资料的你有所收获,也希望能给在这方面有所研究的你有一些相关的启发,同时也希望能给目前对这方面毫无了解的你有一个更进一步的学习。

佛说人生有八苦,悟透不再苦佛教说,人生有八苦:生苦、老苦、病苦、死苦、怨憎会苦、爱别离苦、求不得苦、五阴炽盛苦。人们在成长的过程中,或多或少都会经历这八种苦,福报大,少经历些,福报小,就多感受点。……从今年头两个月看,越南哪个领域最吸引外资及投资国家排名情况2023年3月5日越南官方媒体援引计划投资部刚刚公布的2023年头两个月吸引外商投资的相关数据,这份最新的统计数据揭示了越南吸引外商投资最多的领域基本情形。截止至2023……2022年9月6日国内油价最新消息国内油价本轮调价周期调价日价格预期简报:本轮国内油价调价周期最后一个工作日,根据周期内数据核算,今日24时国内成品油零售最高限价调整预期将有如下变化:预计国六汽油上……我在国外一次险些被诈骗的离奇经历记得那是2019年夏天,我们船从中国盐田港出发,经过中国南海、新加坡、马六甲海峡、印度洋、索马里和红海,再经过苏伊士运河,在地中海航行二天,前后共历时20天,终于抵到希腊比雷埃……教你怎样把剩饺子做得更好吃俗话说,舒服不如倒着,好吃不如饺子。饺子,是一个大众美食。在北方,除夕之夜要吃饺子,大年初一的早晨要吃饺子,初三的早晨还要吃饺子。除此之外,在平常的节假日,改善生活……张大功奥林匹克收藏博物馆举办艺术里的奥林匹克大展喜迎北京冬奥1月25日,在距北京2022年冬奥会开幕还有10天之际,山东潍坊张大功奥林匹克收藏博物馆举办《冰雪之约一一艺术里的奥林匹克》大展,喜迎北京冬奥会的到来。当日,《冰雪之约艺……4。6亿!恭喜国际米兰!今夏签约六大强援,下赛季首发堪称豪华作为意甲赛场的绝对豪门,国际米兰有着无比光辉的历史,3座欧冠冠军、3座欧联杯冠军、1座世俱杯冠军、19座意甲冠军都记载着国际米兰的丰功伟绩。不过,在0910赛季创纪录的拿下三冠……阳了嗓子疼多喝开水真的管用吗?阳了,多喝开水发烧了,多喝开水嗓子疼,多喝开水在如今疫情之下,多喝开水似乎成了一句万能的安慰台词了。成人体内水份含量约占体重的6070,这些水或许都是开……爆冷12,狂轰14脚摆设!中超榜首又易主,泰山队倒下,跌至第文彬少侃球(首发)中超第26轮比赛,成都蓉城队对阵山东泰山队,这场比赛之前,外界就看好泰山队能取胜,因为从两队的整体实力和状态来看,泰山队明显更胜一筹,而且泰山队处于争冠阶段,……金元足球是怎么阻碍了国足的发展金元足球顾名思义,用金钱来招募球员,以追求在最短时间内提高球队的技术水平,并尽可能长期保持竞争水平和影响力。,在过去的多年时间里,各俱乐部纷纷烧钱要成绩,导致球员身价和工资虚高……哈尔滨红肠哪个牌子好吃?商委红肠算是个网红,其实也不算难买,去排队就行,或者商委店门口就有黄牛卖,价格贵一点,吃起来没啥区别,炒作而已,只是因为单纯的量少,并不是味道多好里道斯红肠,这个蛮好的,……女篮进决赛!全场怒吼庆祝,姚明狂笑,王思雨功臣待遇,未见李梦今天女篮和澳大利亚的比赛确实打得太激烈了,双方全场比赛都有领先。不过在末节的最后时刻,王思雨成为了功臣。别忘了,她在防守端完成抢断的情况下帮助球队追平,再加上进攻端两次罚球全进……
以前国家仿制茅台不行,为什么现在酱香酒那么多?谢邀〔作揖〕在回答问题之前纠正一下题主的提问,在1975年,因茅台酒产能有限,周恩来总理提出易地茅台实验,增加茅台酒产能,所以应该是增产,由方毅任厂长,专门从贵州茅台酒厂聘请了……iPhone14Pro新配色曝光辨识度超高,五米外轻松认出6月23日消息,按照惯例苹果在每年的9月份都会推出自家的新iPhone。虽然今年的iPhone14系列还没发布,但随着发布会时间不断临近,网上关于它的信息也越来越多。近日网上就……表面上是阻止外星人入侵的TPS游戏,实则却是一款保姆模拟器《调查局:幽浮解密》是XCOM系列重启之后的第二部系列作,看起来是2K买了这IP之后,给这系列所做的一种全新尝试。就在前作《幽浮:未知敌人》获得了空前的成功之后,想扩充这个IP……阔腿裤快收一收吧,今年更流行九分烟管裤,知性显腿细每年一到夏天,各种款式的裤装让人挑花了眼,冰丝裤、直筒裤、喇叭裤、阔腿裤面对着如此繁多的裤装选项,相信很多人都不知道应该怎么去挑选和搭配了。如果今年夏天你还在纠结裤装的选……入秋了,推荐12道家常下饭菜,好吃不贵,适合秋季吃,天天不重本期导读:入秋了,推荐12道家常下饭菜,好吃不贵,适合秋季吃,天天不重样入秋了,天气也变得凉爽起来,早晚的温差开始加大,夜间开始有了阵阵的凉意。天气变凉,人的胃口也变得好……孩子身高是否达标?身高对照表,一目了然你家孩子今年多大了?身高多少?达到理想身高了吗?孩子的身高问题一直是爸爸妈妈最关心的问题。一起来看看该怎么计算自家孩子身高是否达标。如果没有达标是由什么原因引起的?……特下饭的几道家常菜,美味特开胃,鲜香可口魔芋烧鸭魔芋清洗干净,切片,水烧开,锅里放适量水,水烧开,放魔芋焯水三分钟,捞出沥干水分。鸭肉清洗干净,斩成大块,锅里放适量的水,水烧开,放入鸭块儿,焯水三分钟,捞……简单又下饭,分分钟搞定土豆丝是由土豆为主要食材做成的一道菜品,属于大众菜。常吃土豆能及时地给体内补充所需求的钾元素;土豆中的维生素C对大脑细胞具有保健作用。中医认为引,土豆性平,有和胃、调中、健脾、……大妈在九寨沟脱鞋下水戏水拍照,景区回应行政处罚,公开道歉近日,有网友爆料九寨沟景区内几名大妈脱鞋下水打卡拍照。网传视频中大妈们在水中舞蹈,其他游客则站在水边游览。网友质疑:这可是世界自然遗产,水质被破坏了多少年才可以恢复?工作……NBA收看人数最少的5场总决赛马刺3度上榜,湖火大战创历史新NBA是目前世界上竞技水平最高、球迷群体最多的职业篮球联赛,在全球拥有无数粉丝,尤其是一年一度的总决赛,算是每个赛季的封箱之战,肯定会有更多人关注,今天我们就来聊聊总决赛收看人……南瓜饼的家常做法,口感软糯香甜,简单易学,早餐给孩子吃朋友们,喜欢的可以点赞收藏,记得关注我哟,以后还会有更多美食分享给大家。今天给大家分享一道好吃的早餐南瓜饼,个个松软可口,口感软糯香甜,真是太美味了!!!做法非常简单,自……湖北小县城饺子王,30多年只卖一种馅,10元一份,都是回头客饺子是我国独有的传统特色美食,每逢节日餐桌上必不可少,饺子的制作过程并不复杂,家家户户都会包,是贴近人们生活的一种平民美食。别看每家每户都会包饺子,并不妨碍街上专门卖饺子的店生……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网