Install shield打包时踩过的坑
Install shield是Visual studio官方指定打包工具,但官方说明文档和网上相关资料太少,打包过程中只能自己摸索。本文记录了项目中踩的坑,希望有所帮助。
打包时怎么加入所有相关文件?
打包时怎么处理非托管COM组件?
如何选择.NetFramework?
WIN10+VS2015环境里开发的软件,怎么运行在WIN7环境里?
有的DLL在开发环境里运行的很好,为什么在有的电脑上无法正常运行?
1 打包时怎么能加入所有相关文件?
打包时需要包含DLL,图片资源文件和其他配置文件。
复杂些的解决方案都包含了多个项目,一个项目依赖于其他项目,这个时候就需要把其他项目涉及也加入到 project output中。
有一个思路是,参考主项目output目录下的相关资源,通过Add folder或Add file的方式,把这些资源都加入打包。
也可以参考csproj中和CopyToPOutputDirectory的资源,如果有间接引入的资源,就没办法了。比如EmguCV.props里引用了相关资源,但无法直观发现。
2 打包时怎么处理非托管COM组件?
项目里用到COM组件,C#程序通过interop技术对其引用。
打包时,需要配置COM组件属性。选中COM DLL,右击选择属性(property),配置COM属性
3 如何选择.NetFramework?
install shield里选择打包的.NetFramework要和项目属性里的目标框架保持一致。目标框架是可选的,和VS版本没有对应关系。
4 WIN10+VS2015环境里开发的软件,怎么运行在WIN7环境里?
官网说明 Determining Which DLLs to Redistribute https://msdn.microsoft.com/en-us/library/8kche8ah.aspx 里“The version of the redistributable package must match the version of the Visual Studio toolset used to create your application”
只要部署Visual C++ 2015 Redistributable Package 就可以运行VS2015开发的软件。打包配置如下。
install shield limited edition似乎不支持VC2013 -.-
5 有的DLL在开发环境里运行的很好,为什么在其他电脑上常常无法运行?
这些DLL不是在项目开发环境里生成的,比如可能是在Visual Studio2012的环境下编译的,那么这些DLL就可能依赖于Visual C++2012中的系统库,参考上一条打包加入VC2012。
DLL对系统库的依赖可以通过Depends Walker查看。
6 项目编译成x86程序。打包时,在程序运行目录下面加入了x86子目录,存放部分DLL。结果发现在win10 32位/64位系统里可以正常运行,但在win7 32位和部分的win7 64位系统里找不到x86目录下的DLL,导致运行失败。
最后解决办法是把DLL拷贝到程序运行目录。
微软官网里对于"Dynamic-Link Library Search Order"有说明(https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx) ,"The directory from which the application loaded.". 但没有明确说明如何处理x86子目录中的DLL。
零零碎碎的问题搞定后,C#平台中的基础概念也弄清楚了。