我终于解决了我的问题。这一切都归结为 Installshield 如何处理 .Net 程序集及其依赖项的打包。
Installshield 引用 .Net exe 及其依赖项的方式之间的区别:
每当您添加主项目输出时,例如pqr.exe
在我的情况下,它就会被添加到组件中。当您浏览您的组件时,您将根据 installshield 环境的标准已知变量(例如等)在Link To
列下看到 exe 的源路径。[InstallDir]\ComponentName\
现在,当 installshield 必须创建用于部署 .Net 程序集的 MSI 包时,例如pqr.exe
在我的情况下,它还尝试打包其依赖项以进行部署。就我而言prq.exe
,取决于abc.dll
. 但需要注意的是 installshield 不会在其自己的*.ISM
安装程序项目文件中静态维护 .Net 程序集的依赖项列表。
所以abc.dll
也显示在组件中,但它的路径是作为 ISM 文件正在构建的磁盘上的完全限定路径,例如D:\mywork\MSIProject\
. 这是因为abc.dll
它实际上不是 ISM 安装程序项目文件的一部分。其实我用文本编辑器打开了xml格式的ISM文件,试着搜索了abc.dll
一下,根本没有。因此abc.dll
不作为要在 ISM 安装程序定义文件中部署的程序集存在。但只有在构建 ISM 文件时,它才会尝试将所有依赖项与 *.exe 文件一起打包。
所有依赖项都应该存在于 *.exe 文件所在的同一根目录中,否则 installshield 将无法打包它们。
installshield 如何打包 .Net exe 及其依赖项之间的区别:
另一个需要注意的区别是,如果您pqr.exe
从构建 ISM 文件的磁盘路径中删除,则 ISM 文件将无法构建,但如果您删除abc.dll
(这不是 ISM 定义文件的物理部分,因为它只是一个参考/依赖项),那么 ISM 文件仍将成功构建。
installshield 中的自定义操作如何引用 .Net exe 及其依赖项之间的区别:
就我的实际问题而言,您只能在自定义操作中直接引用那些作为组件一部分的程序集。您不能引用逻辑上看起来像组件的一部分的程序集(因为它们是依赖项),但实际上它们只是因为它们是托管 .Net exe 文件的依赖项而显示在那里。