关于C++,VC++.Net和C#.Net混合编程中系统库(System32目录中动态库)引用问题

一、项目背景

       最近公司在使用VS2012开发一个关于SSH相关的项目,需要连接系统中所有的SSH终端,因自己根据SSH协议进行底层的开发工作量和难度都很大,因此准备在网络上寻找已有的SSH库进行开发。经过查找,目前网络上已有的SSH库有Granados、LibSSH2等,Granados库为.NET库,该哭简单易用,在.Net开发中使用该库非常容易,但该库支持的用户认证方式仅有密码认证方式,不支持键盘交互认证和公钥认证方式。LibSSH2库为C语言库,接口丰富,支持目前SSH协议提供的三种用户认证方式(密码认证、键盘交互认真、公钥认证),但使用难度比较大,在.Net项目中使用该库也比较复杂。

      因项目中需要连接的终端数目比较大,同时各品牌的终端使用的认证方式也不一样,因此只有选择LibSSH2库进行开发。LibSSH2为开源项目,需要自己下载源代码进行编译,网络上也有一些编译好的版本,但个人觉得还是自己下载源码编译比较好。LibSSH2库下载地址:http://www.libssh2.org/,源码编译方式见我转载的文章:win32下vs2012 编译 libssh2

二、项目结构

       项目开发采用混合编程,上层界面层使用C#进行开发,底层使用C++对libssh2.lib进行封装,再在上层使用VC++.net进行封装后供C#界面层调用,大致结构图如下图。


三、软件发布

      软件编写完成,在开发机器上能正常运行,准备发布给运维工程师正式使用,这时才发现在运维工程师的非开发机器上根本没法运行,主要遇到以下几个问题:

1、系统平台问题(32位系统和64位系统)

     最开始拿给运维工程师试用的是Debug版本的程序,刚好试用软件的那个运维工程师机器所装的系统为64位win7系统,程序给出下图提示后直接退出:

出现该错误,第一反应时缺少DLL文件,但是缺少那些DLL文件,却没给出提示,于是在网络上大量寻找相关错误信息,经过各种尝试,把System32目录下的msvcp110d.dll文件放到程序同级目录下,在32位Win7系统下终于可以正常运行,但在64位系统下始终无法运行,以为是平台问题,于是重新设置vs2012编译器,编译64位的程序,但32位设置下能正确编译的程序,设置为64位编译选项后,确各种链接错误,经过多番折腾仍不能解决,于是放弃。注:该问题最后才知道不是平台原因,根本问题还是因为缺少dll。

2、混合编程中Debug和Release版本内存访问错误问题

      在调试debug版本时,程序会报“访问已经释放的内存错误”,经过查找却未能找到相关内存操作的错误,后面尝试编译release版本,release版本能正常运行,怀疑该问题是托管和非托管代码混合编程中debug版本未处理好有关内存操作的代码造成的。

3、关于引用的dll的问题

     发布到非开发环境的机器上,因使用的是vs2012开发工具,在程序发布到无开发环境的机器上时,需要将msvcr110.dll和msvcp110.dll两个dll文件与软件一起发布,不然在无开发环境的机器上运行程序会出现图1中的错误,若是debug版本程序,相应的需要将msvcr110d.dll和msvcp110d.dl两个dll文件一起发布(注:debug版本似乎不需要msvcp110d.dll也可以运行)。因该项目中使用到了libssh2库,在发布程序时,除了将libssh2.dll与程序一起发布外,还需要将libssh2使用到的第三方库libeay32.dll一起发布。通过将这些系统库和第三方库与程序一起发布后,在32位系统和64位系统上都能正常运行,而不需要去专门编译64位版本的程序。

    注:若是使用vs2012编写的mfc程序,需要将mfc110.dll一起发布(debug版本未mfc110d.dll)。

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值