经过几天的点击和试用后,我为一个简单的解决方案创建了WIX安装程序,并遵循了几个教程,以便包括在安装结束时启动应用程序的选项,在桌面和添加/删除程序中添加图标的应用程序快捷方式名单。当它完全运行时,我为包含6个项目和SQLite数据库的原始项目复制了相同的过程。但是现在当我安装安装程序时,单击桌面上已安装的图标无效。它不会启动指定的exe。请帮助我。
我应该分享wxs代码吗?
更新:以下是我的.wxs文件的大部分代码。抱歉,我无法破译问题的根源,因此必须包含除标准顶级标签之外的所有代码。此外,一旦发现问题,它可以成为其他Wix用户受益的参考。
<!-- Embed cab1 file inside the package -->
<Media Id="1" Cabinet="cab1.cab" EmbedCab="yes" />
<!-- Specify Installation folders -->
<Directory Id="TARGETDIR" Name="SourceDir">
<!-- Program Files folder i.e. on HDD -->
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="Pihu" />
</Directory>
<!-- Program Menu folder i.e. on Start Menu -->
<Directory Id="ProgramMenuFolder">
<Directory Id="ProgramMenuDir" Name="Pihu Co." />
</Directory>
<!-- Desktop folder-->
<Directory Id="DesktopFolder"/>
</Directory>
<!-- Add Main App's exe-->
<DirectoryRef Id="INSTALLFOLDER">
<Component Id="Pihu.exe" Guid="*">
<File Id="PihuEXE" Source="../Pihu/bin/$(var.BUILD)/Pihu.exe"
Name="Pihu.exe" KeyPath="yes"/>
</Component>
</DirectoryRef>
<!-- Icon for Add/Remove Program must be specified separately by following 2 lines -->
<Icon Id="AddRemoveProgIcon" SourceFile="Pihu.ico"/>
<Property Id="ARPPRODUCTICON" Value="AddRemoveProgIcon" />
<!-- Add shortcut for Start Menu-->
<DirectoryRef Id="ProgramMenuDir">
<Component Id="StartMenuShortcut" Guid="*">
<Shortcut Id="StartMenuShortcut" Name="Pihu HMI" Description="Pihu HMI"
Target="[INSTALLFOLDER]Pihu.exe" WorkingDirectory="INSTALLFOLDER">
<!--Add Icon to the ShortCut-->
<Icon Id="StartMenuIcon" SourceFile="Pihu.ico"/>
</Shortcut>
<RegistryValue Root="HKCU" Key='Software\[Manufacturer]\[ProductName]'
Name="installed" Type="string" Value="[INSTALLFOLDER]" KeyPath="yes"/>
<!--Remove the StartMenu folder at Uninstall time -->
<RemoveFolder Id="StartMenuShortcut" On="uninstall"/>
</Component>
</DirectoryRef>
<!-- Add shortcut for DeskTop-->
<DirectoryRef Id="DesktopFolder">
<Component Id="DesktopShortcut" Guid="*">
<Shortcut Id="DesktopShortcut" Name="Pihu HMI" Description="Pihu HMI"
Target="[INSTALLFOLDER]Pihu.exe" WorkingDirectory="INSTALLFOLDER">
<Icon Id="DeskTopIcon" SourceFile="Pihu.ico"/>
</Shortcut>
<RegistryValue Root="HKCU" Key='Software\[Manufacturer]\[ProductName]'
Name="installed" Type="string" Value="[INSTALLFOLDER]" KeyPath="yes"/>
<RemoveFolder Id="DesktopFolder" On="uninstall"/>
</Component>
</DirectoryRef>
<WixVariable Id="WixUILicenseRtf" Value="License.rtf"/>
<!-- Add Component -->
<Feature Id="MainApplication" Title="Pihu HMI" Level="1" ConfigurableDirectory="INSTALLFOLDER">
<ComponentRef Id="Pihu.exe" />
<!-- Add feature for Start menu shortcut-->
<ComponentRef Id="StartMenuShortcut" />
<!-- Add feature for DeskTop shortcut-->
<ComponentRef Id="DesktopShortcut" />
</Feature>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch Pihu HMI Application now" />
<Property Id="WixShellExecTarget" Value="[#PihuEXE]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
<UI>
<UIRef Id="WixUI_FeatureTree"/>
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="LaunchApplication">
WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed
</Publish>
</UI>
从Debug或Release文件夹运行时,Pihu.exe运行正常。第一个屏幕独立于DB,因此不会出现问题。我认为唯一的问题是解决方案是多项目(尽管所有依赖项目的dll也存在于Debug和Release文件夹中)
答案 0 :(得分:1)
我会&#34;进化&#34;一旦你在问题中添加更多细节,这个答案。我想避免太多评论。是的,请在你的问题中分享你的WiX源的核心,或者甚至是已编译的MSI本身,如果它是公开的而且不是太大而且你有一个上传它的地方 - 链接到它。 / p>
在发布之前,请从WiX源中删除任何密码,数据库连接字符串,用户名,共享名称,IP地址或其他敏感数据。一个好的软件包不应该硬编码任何一个(它们应该是最终用户在安装时设置的参数),但是正如我们所知,有时硬编码的东西(通常来自你的开发盒)偷偷进入开发过程中的来源 - 给它一次性。还请删除源代码中的硬编码GUID - 用PUT-GUID-HERE替换它们(不是那么重要,如果你不确定如何,我们会帮你做到这一点。)
以下是如何记录您的安装:
msiexec.exe /I "C:\Installer.msi" /QN /L*V "C:\msilog.log"
快速参数说明:
/I = run regular installation sequence
/QN = run completely silently
/L*V "C:\My.log" = verbose logging at specified path
如果这令人困惑try installsite.org's logging FAQ - 如何为您的安装创建日志文件。
Wix没有特色&#34; automagic&#34; - 开箱即用 - 在构建时自动包含所有相关文件(除非有我不知道的新功能)。
您必须手动指定要使用MSI安装哪些文件,坦率地说,这是我认为的预期行为 - WiX为您提供的是安装程序的控制和灵活性 - 代价是处理有些繁琐有时。但是,如果您尽可能轻松地做到这一点,您将会欣赏MSI的WiX源的灵活性和清晰度。
那么,你如何处理这个尽可能简单?我只想将你的构建类型设置为&#34; Release&#34;在Visual Studio中,然后转到Debug => Start Debugging
以交互方式运行项目。现在转到Debug => Windows => Modules
并记下所有已加载的文件(模块)。然后将解决方案中加载的文件包含在WiX源中以部署到目标系统,并识别从计算机上其他位置加载的共享文件(系统文件)(例如GAC),并确定它们是否需要安装运行时在系统上。您不得直接在WiX源中包含此类共享(或系统)文件,而应通过合并模块(用于安装共享运行时的机制)或执行安装运行时的单独setup.exe。
要将这些文件包含在WiX源中,只需将它们添加到WiX源中的相应目录即可。最简单的形式:
<Component>
<File Source="C:\Users\Acer\SourceControl\MyProject\CoreApp.exe" />
</Component>
上面的组件包含一个文件,该元素利用了WiX根据文件名本身默认大多数属性的能力。组件ID和GUID是自动生成的 - 文件ID和名称也是如此。我之前在这个答案中简要介绍了这个问题 - 可能有一个快速浏览: Syntax for guids in WIX? 。
在您的源代码中内联,添加文件看起来像这样(使用上面链接答案中描述的这些最小组件元素):
<DirectoryRef Id="INSTALLFOLDER">
<Component Id="Pihu.exe" Guid="*">
<File Id="PihuEXE" Source="../Pihu/bin/$(var.BUILD)/Pihu.exe"
Name="Pihu.exe" KeyPath="yes"/>
</Component>
<Component>
<File Source="C:\Users\Acer\SourceControl\MyProject\CoreApp.exe" />
</Component>
<Component>
<File Source="C:\Users\Acer\SourceControl\MyProject\CoreApp.dll" />
</Component>
<Component>
<File Source="C:\Users\Acer\SourceControl\MyProject\CoreApp2.dll" />
</Component>
</DirectoryRef>
这是我能想到的最简单的模型。 source属性是您需要指定的唯一必需属性。我已将其设置为绝对路径以确保文件编译,但您应该使用WiX项目变量,就像在上面的源代码中一样。 See Using Project References and Variables。当你在这里时,你也应该快速查看Preprocessor features。
如果您按照说明正确地执行项目引用和变量,您应该能够获得类似于此的源代码(但是在深入研究之前可能会使用绝对路径编译WiX源代码 - 请注意{ {1}}显然是编译应用程序二进制文件的Visual Studio项目的名称:
ConsoleApplication
请放手一搏。我现在没有时间测试编译,我自己使用不同的方案(我使用预处理器和<DirectoryRef Id="INSTALLFOLDER">
<Component Id="Pihu.exe" Guid="*">
<File Id="PihuEXE" Source="../Pihu/bin/$(var.BUILD)/Pihu.exe"
Name="Pihu.exe" KeyPath="yes"/>
</Component>
<Component>
<File Source="$(var.ConsoleApplication.TargetDir)\SupportFile1.dll" />
</Component>
<Component>
<File Source="$(var.ConsoleApplication.TargetDir)\SupportFile2.dll" />
</Component>
<Component>
<File Source="$(var.ConsoleApplication.TargetDir)\SupportFile3.dll" />
</Component>
</DirectoryRef>
语句来指定我已复制所有输出文件的发布文件夹 - 我不&# 39;直接从Visual Studio输出文件夹中引用文件。)
看起来您已经使用BUILD变量执行此操作,但我通常使用基本构建输出路径,例如:
<?define?>
然后我的源元素变成这样:
<?define RELEASEFOLDER= "R:\Releases\ProductName\5.0.2\"?>
我认为还有更多细节和可能的意见,但我希望它可以帮助您解决问题。一旦设置好WiX源,就可以在需要时进行调整。灵活性非常出色。
如果你只想添加几个文件,上面的方法应该没问题。但是,如果要添加大量文件,则应使用WiX工具 <Component>
<File Source="$(var.RELEASEFOLDER)\MyApp.exe" />
</Component>
。它可以让你收获&#34;目录并生成带有所需组件和文件元素的WiX XML,以安装相关文件。 Here is the official documentation for heat.exe
在最简单的形式中,您可以使用以下内容:
heat.exe
之类的内容生成WiX XML文件heat.exe dir . -sfrag -out HeatTest.wxs
。它现在将包含所需的XML,用于从您导航到的文件夹和下面的文件夹中安装有问题的文件(HeatTest.wxs
表示当前文件夹)。.
,因为可以自动生成GUID。我没有看到允许创建&#34; Minimal WiX XML&#34; - 换句话说,只有必需的属性。我想你也可以省略目录ID。Guid="PUT-GUID-HERE"
。试试看。现在,Source属性变为:heat.exe dir . -sfrag -var var.RELEASEFOLDER -out HeatTest.wxs
而不是Source="$(var.RELEASEFOLDER)\src\Burn\Frost\Frost.sln"
。通过一些练习,使用此heat.exe工具创建MSI的基本安装结构非常快速,并对生成的源进行一些手动清理。我非常喜欢创建繁琐且文件密集的文件#34;诸如IIS安装程序之类的软件包可能包含数千个无法尝试手动创建WiX XML的文件。