最近开发一个SSH相关的项,项目背景见另一篇文章:http://blog.csdn.net/xzhswust/article/details/17714593,需要在该项目基础上,将SSH访问部分抽离为web服务,并部署到64位Windows Server 2008 IIS服务器上,供其他程序调用;
因为有winform程序的基础,而且也解决了在win32和win64系统上运行的问题,本以SSH访问部分抽离后部署到64位系统的IIS上也是个很简单的事情,结果却耗费了两天时间才解决该问题。
Web服务编写完成(该web服务为win32程序,包括底层调用的C++ dll也都为win32库),在本机调试没有任何问题,于是先发布到本地文件系统,再将该文件拷贝到64位IIS服务器上的wwwroot目录下,按常规方式配置好IIS站点,在浏览器中访问,提示缺少依赖性。在网上查找相关C++ dll在IIS下运行的文章,搜索到比较有参考意义,据说别人也成功解决问题的文章,有兴趣的兄弟姐妹可以自己去仔细研究下,文章地址:http://blogs.msdn.com/b/jorman/archive/2007/08/31/loading-c-assemblies-in-asp-net.aspx,该文章是个老外写的,据说也能成功解决这种缺少C++ dll依赖的问题。但我按照文章所说的两种方法依然没能解决,仍然提示”加载程序集或程序集的某个依赖性失败“。问题仍然没能解决,于是开始各种尝试:
1、首先尝试web服务发布到win32机器上是否能运行;
在虚拟机上安装32位win7系统,安装IIS,将程序发布到该系统中,分别按照http://blogs.msdn.com/b/jorman/archive/2007/08/31/loading-c-assemblies-in-asp-net.aspx文章所说的两种方法重新编译程序,发布,仍然提示缺少依赖项。使用DEPENDS.EXE查看所有非托管dll的依赖项,把所有依赖项都拷贝到文章所说的目录,还是提示缺少依赖项,最后将所有非托管dll及其依赖的dll全部拷贝到system32目录,所有的托管dll仍然放在网站bin目录下,在浏览器中访问该web服务,成功运行,暗自高兴了一把,以为在win64系统中也这样处理,应该也能成功运行,结果却不是这样。
注:如果将所有非托管dll都拷贝到system32目录下,不需要执行老外的那篇文章那样所说的那些操作;
2、尝试在win64机器上是否能运行;
按照win32系统上的部署方法部署该web服务,在浏览器中访问,仍然提示缺少程序依赖项;于是又开始了各种尝试,此处省略一千字.................;最后将所有非托管dll及其依赖的所有dll都拷贝到Windows\WOW64目录下,同时在该站点对应的Application Pool的高级设置中将“Enable 32bit Applications”,设置为true,再在浏览器中访问该web服务,成功运行,问题总算解决;原因分析:因win64系统上运行32位程序实际上是在wow64上运行的,因此查找运行环境dll也是在Windows\WOW64目录下进行查找,而不是在System32目录下进行查找,因此将dll拷贝到System32目录下仍然会提示缺少依赖项,因为IIS不在System32目录下查找依赖的dll。