做.net的早晚会用到,并且网上还没有这方面的正确资料或几乎很少

一直以来,找安装程序的msi源文件路径得到的都是“system32”的路径,安装程序做完了,学习WIX的时候发现了方法,并已经测试成功了。

网上有很多获取源文件路径的方法,比如

1、扫描当前所有进程,获取meiexec进程的路径

2、获取当前程序的路径

3、获取发起当前进程的路径

事实上这些路径都不是msi的路径。那么:

怎么获得msi文件的路径?

切换到“自定义视图界面”,打开“自定义操作”属性界面中customactionData属性填入/Sdir=[SourceDIR],

然后在安装方法中写上string sdir=Context.Parameters["SDIR"];

 

注意:
1、/Sdir=[SourceDIR]与/Sdir="'[SourceDIR]'"等效都可以获得路径,区别是后者得到的路径有“‘”单引号。(测试补充:如果路径中含空格则一定要使用双引号内部单引号的方法
2、该路径需要处理才能使用,由于系统内部各种转义字符的缘故,得到的路径需要将“\\”替换成“\”,
方法sdir=sdir.replace("\\\\","\\"),也可以这么写sdir=sdir.replace(@"\\",    @"\"),
3、其他的写法均会报错

 

为什么哪些路径不是msi数据库文件的路径?

我们需要将安装程序分成两部分来看,一是setup.exe,二是[productname].msi

前者是引导程序,跟我们写的代码无关;后者是手写的代码和安装相关的文件等等。

msi源文件的路径是msi的一个属性,在win7等系统中右键属性详细信息可以看到msi文件现在的路径,在server2003中直接看不到。

执行msi文件的命令是msiexec.exe [productname].msi……,其中msiexec.exe 的路径是%windir%\system32\msiexec.exe

所以前面的那些方法都不适合windows installer安装过程中获得msi文件的路径,那些方法都是msiexec.exe的路径。

 

 

获得msi文件路径有什么用?

目前我想到的至少有2个主要作用:

第一,大多时候在做64位兼容的问题上,并不需要将x64和x86的安装包分开,但是vs又不让将这两者打包到一个msi数据库文件中。那么我们可以当x86的包生成完后,将x64的小程序方法到安装包的目录或指定子目录下,这样就可以通过sdir来调用了。

第二,安装的时候有些文件时为产品运行服务的,有些文件是为安装服务的。后面的这种文件并不一定需要拷贝到安装目录下,另外如果网络安装,还可以保护你写的程序只安装时调用

不足之处请指正

posted @   二师弟tl  阅读(1002)  评论(5编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示