C#应用程序(使用WIX创建的安装程序)在安装后不会运行

时间:2018-01-01 10:52:56

标签: c# wix windows-installer

经过几天的点击和试用后,我为一个简单的解决方案创建了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文件夹中)

1 个答案:

答案 0 :(得分:1)

我会&#34;进化&#34;一旦你在问题中添加更多细节,这个答案。我想避免太多评论。是的,请在你的问题中分享你的WiX源的核心,或者甚至是已编译的MSI本身,如果它是公开的而且不是太大而且你有一个上传它的地方 - 链接到它。 / p>

关于在线发布WiX信息源的快速说明:

在发布之前,请从WiX源中删除任何密码,数据库连接字符串,用户名,共享名称,IP地址或其他敏感数据。一个好的软件包不应该硬编码任何一个(它们应该是最终用户在安装时设置的参数),但是正如我们所知,有时硬编码的东西(通常来自你的开发盒)偷偷进入开发过程中的来源 - 给它一次性。还请删除源代码中的硬编码GUID - 用PUT-GUID-HERE替换它们(不是那么重要,如果你不确定如何,我们会帮你做到这一点。)

初学者的一些问题:

  • 您是否为产品代码,包装代码,组件GUID等使用了新的GUID?如果重新使用包代码或组件代码,可能会出现奇怪的结果。重用相同的产品代码更容易检测,但这也可能导致问题。
  • 您是否尝试直接从文件系统启动主EXE? (检查问题是否与快捷方式有关)。
  • 尝试启动应用程序时是否有任何错误消息?您是否也检查了事件日志(除了任何GUI错误)?该应用程序是否具有自己的自定义日志?如果是,请检查。
  • 安装后是否扫描了二进制文件中的依赖项?刚刚写了一个我最近写的答案的链接:After creating MSI Installer for WPF app in Visual Studio 2017, EXE does nothing(Dependencies.exe,procmon.exe,visual studio modules视图,几个选项...)。您也可以尝试使用旧的Dependency Walker,即使它现在已经过时了,也不能很好地处理Win32程序集依赖关系或Api-Sets。
  • 您是否记录了MSI安装?如果没有,请这样做并检查是否有任何错误。 有关如何记录MSI安装的信息,请参阅以下部分

记录您的MSI-Install

以下是如何记录您的安装:

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源,就可以在需要时进行调整。灵活性非常出色。

使用heat.exe来&#34;收获&#34;文件夹

如果你只想添加几个文件,上面的方法应该没问题。但是,如果要添加大量文件,则应使用WiX工具 <Component> <File Source="$(var.RELEASEFOLDER)\MyApp.exe" /> </Component> 。它可以让你收获&#34;目录并生成带有所需组件和文件元素的WiX XML,以安装相关文件。 Here is the official documentation for heat.exe

在最简单的形式中,您可以使用以下内容:

  1. 打开命令提示符并导航到要包含在MSI中的文件夹结构。
  2. 尝试使用heat.exe之类的内容生成WiX XML文件heat.exe dir . -sfrag -out HeatTest.wxs。它现在将包含所需的XML,用于从您导航到的文件夹和下面的文件夹中安装有问题的文件(HeatTest.wxs表示当前文件夹)。
  3. 我更喜欢用空字符串搜索和替换.,因为可以自动生成GUID。我没有看到允许创建&#34; Minimal WiX XML&#34; - 换句话说,只有必需的属性。我想你也可以省略目录ID。
  4. 我还想用定义的值替换源属性默认路径,例如RELEASEFOLDER。这样的事情:Guid="PUT-GUID-HERE"。试试看。现在,Source属性变为:heat.exe dir . -sfrag -var var.RELEASEFOLDER -out HeatTest.wxs而不是Source="$(var.RELEASEFOLDER)\src\Burn\Frost\Frost.sln"
  5. 通过一些练习,使用此heat.exe工具创建MSI的基本安装结构非常快速,并对生成的源进行一些手动清理。我非常喜欢创建繁琐且文件密集的文件#34;诸如IIS安装程序之类的软件包可能包含数千个无法尝试手动创建WiX XML的文件。