动态链接库C.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
发生的背景 在研发新项目中使用了新的语言研发c#和新的技术方案web service,不过在新项目中,一些旧的模块需要继续使用,一般是采用c或c++或delphi编写的,怎么利用旧模块对于研发人员来说,有三种可用方法供选择:第一、将c或c++函数用c#完全改写一遍,这样整个项目代码比较统一,维护也方便一些。不过尽管微软及某些书籍说,c#和c++怎么接近,不过改写起来还是非常痛苦的事情,特别是c++里的指针和内存操作;第二、将c或c++函数封装成com,在c#中调用com比较方便,只是在封装时需要处理c或c++类型和com类型之间的转换,也有一些麻烦,另外com还需要注册,注册次数多了又可能导致混乱;第三、将c或c++函数封装成动态链接库,封装的过程简单,工作量不大。因此我决定采用加载动态链接库的方法实现,于是产生了在c#中怎么调用自定义的动态链接库问题,我在网上搜索相关主题,发现一篇调用系统api的文章,不过没有说明怎么解决此问题,在msdn上也没有相关周详说明。基于此,我决定自己从简单出发,逐步试验,看看能否达到自己的目标。 (说明一点:我这里改写为什么非常怕麻烦,我改写的代码是变长加密算法函数,代码有600多行,对算法本身不熟悉,算法中指针和内存操作太多,要想确保算法正确,最可行的方法就是少动代码,否则只要有一点点差错,就不能肯定算法和以前兼容) 二、技术实现 下面看看怎么逐步实现动态库的加载,类型的匹配: 动态链接库函数导出的定义,这个不必多说,大家参考下面宏定义即可: #define libexport_api extern c __declspec(dllexport) 第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和: libexport_api int mysum(int a,int b){ return a+b;} c#定义导入定义: public class refcomm { [dllimport(libencrypt.dll, entrypoint= mysum ,charset=charset.auto,callingconvention=callingconvention.stdcall)] public static extern int mysum (int a,int b); } 在c#中调用测试: int isum= refcomm. mysum(2,3); 运行查看结果isum为5,调用正确。第一步试验完成,说明在c#中能够调用自定义的动态链接库函数。 第二步,我定义了字符串操作的函数(简单起见,还是采用前面的函数名),返回结果为字符串: libexport_api char *mysum(char *a,char *b){sprintf(b,”%s”,a) return a;} c#定义导入定义: public class refcomm { [dllimport(libencrypt.dll, entrypoint= mysum ,charset=charset.auto,callingconvention=callingconvention.stdcall)] public static extern string mysum (string a, string b); } 在c#中调用测试: string strdest=””; string strtmp= refcomm. mysum(“12345”, strdest); 运行查看结果strtmp为“12345”,不过strdest为空。 我修改动态链接库实现,返回结果为串b: libexport_api char *mysum(char *a,char *b){sprintf(b,”%s”,a) return b;} 修改c#导入定义,将串b修改为ref方式: public class refcomm { [dllimport(libencrypt.dll, entrypoint= mysum ,charset=charset.auto,callingconvention=callingconvention.stdcall)] public static extern string mysum (string a, ref string b); } 在c#中再调用测试: string strdest=””; string strtmp= refcomm. mysum(“12345”, ref strdest)

文档评论(0)

mv2323 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档