无法从自定义操作浏览/引用.net类库dll文件(这是产品部署和.Net exe文件的依赖项的一部分)

时间:2017-03-08 08:22:00

标签: installation installer custom-action installshield-2014

我正在基本的MSI(installshield 2014)项目中创建一个新的自定义操作。我将在托管的.Net程序集abc.dll中调用公共方法,该方法将作为产品部署的一部分进行部署。 abc.dll是名为component1的组件的一部分,该组件是设置设计中功能feature1的一部分。

当我尝试在自定义操作创建向导中引用该程序集时,我将其Location称为Installed with the product。但是当我尝试在部署路径中浏览Action Parameters时,在自定义操作创建向导的abc.dll步骤中,我看不到它:

enter image description here

虽然我可以在组件中浏览时看到abc.dll,如下面的快照所示。 abc.dll作为component1的一部分存在,并部署在产品的%programfiles%路径中。

enter image description here

另一方面,我可以在自定义操作创建向导中看到pqr.exe文件(它被部署为另一个组件component2的一部分),如下面的快照所示:

enter image description here

任何人都可以指导我为什么会这样吗?

2 个答案:

答案 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文件的依赖项而在那里显示。