我正在基本的MSI(installshield 2014)项目中创建一个新的自定义操作。我将在托管的.Net程序集abc.dll
中调用公共方法,该方法将作为产品部署的一部分进行部署。 abc.dll
是名为component1
的组件的一部分,该组件是设置设计中功能feature1
的一部分。
当我尝试在自定义操作创建向导中引用该程序集时,我将其Location
称为Installed with the product
。但是当我尝试在部署路径中浏览Action Parameters
时,在自定义操作创建向导的abc.dll
步骤中,我看不到它:
虽然我可以在组件中浏览时看到abc.dll
,如下面的快照所示。 abc.dll
作为component1
的一部分存在,并部署在产品的%programfiles%
路径中。
另一方面,我可以在自定义操作创建向导中看到pqr.exe
文件(它被部署为另一个组件component2
的一部分),如下面的快照所示:
任何人都可以指导我为什么会这样吗?
答案 0 :(得分:0)
我假设InstallShield正在验证这些二进制文件是否可以作为自定义操作进行调用。可执行文件可以作为自定义操作运行,因此它会显示出来。除非导出具有所需签名的入口点,否则不能任意调用Dll。 Windows Installer没有本机支持来调用托管代码自定义操作,因此也许InstallShield提供了一个C ++填充程序来调用(与Visual Studio安装程序项目一样)。否则C ++ Dll需要有这个签名:
UINT__stdcall CustomActionEntryPoint(MSIHANDLE hInstall)
这里的例子:
https://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup-projects-and-custom-actions/
https://www.codeproject.com/Articles/570751/DevMSI-An-Example-Cplusplus-MSI-Wix-Deferred-Custo
正如我所说,您的IS版本可能支持在调用Dll的其他描述下调用托管代码Dll(而不是像#34;调用标准的Windows Installer自定义操作")。
答案 1 :(得分:0)
我终于把问题解决了。这一切都归结为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 insataller项目文件的一部分。事实上,我在文本编辑器中打开了ISM文件的xml格式,并尝试搜索abc.dll
,但它根本就没有。因此,abc.dll
不作为要部署在ISM安装程序定义文件中的程序集存在。但只有在构建ISM文件时,它才会尝试将所有依赖项与* .exe文件打包在一起。
所有依赖项都应存在于存在* .exe文件的同一根目录中,否则installshield将无法打包它们。
installshield如何打包.Net exe及其依赖项之间的区别:
要注意的另一个不同点是,如果从构建ISM文件的磁盘路径中删除pqr.exe
,则ISM文件将无法构建,但如果删除abc.dll
(不是ISM定义文件的物理部分,因为它只是一个引用/依赖项),然后ISM文件仍将成功构建。
安装屏幕中的自定义操作如何引用.Net exe及其依赖项之间的区别:
就我的实际问题而言,您只能在自定义操作中引用那些直接作为组件一部分的程序集。你不能引用逻辑上看起来只是组件的一部分的程序集(因为它们是依赖项),但实际上它们只是因为它们是托管的.Net exe文件的依赖项而在那里显示。