【问题标题】:How to bundle dependency .dll files with main product in WiX如何在 WiX 中将依赖项 .dll 文件与主要产品捆绑在一起
【发布时间】:2019-01-15 16:25:19
【问题描述】:

我正在为具有许多依赖项的 .NET 项目创建一个 wix 安装程序。目前,我有一个可用的 .msi 安装程序,但正如预期的那样,所有依赖项 .dll(以及资源​​文件夹)都放在与已安装应用程序相同的目录中,而不是与其捆绑在一起。

阅读WIX Bundle Creation 的答案,似乎可以将我的产品原样保留在一个文件中,并在另一个文件中包含引用该产品的捆绑包,但我似乎找不到任何示例。

有没有简单的方法来做到这一点?我在下面包含了产品代码的概要。

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:ui="http://schemas.microsoft.com/wix/UIExtension">  
    <Product Id="*" Name="#####" Language="1033" Version="1.0.0.0" Manufacturer="..." UpgradeCode="...">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64"/>

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
    <UIRef Id="WixUI_InstallDir" />

        <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate EmbedCab="yes"/>

        <Feature Id="ProductFeature" Title="alphaInstaller" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
            <ComponentGroupRef Id="ProductMenuComponents" />
            <ComponentGroupRef Id="DependencyComponents"/>
            <ComponentGroupRef Id="ResourcesComponents"/>
        </Feature>
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
         <Directory Id="ProgramMenu64Folder">
            ...
        </Directory>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
          <Component Id="CMP_alphaGUISetup" Win64="yes">
             <File Id="FILE_alphaGUIApplication.exe" Source="$(var.alphaGUI.TargetPath)" KeyPath="yes"></File>
          </Component>
        </ComponentGroup>
    <ComponentGroup Id="ProductMenuComponents" Directory="ApplicationProgramsFolder">
      <Component Id="ApplicationShortcut" Guid="..." >
        <Shortcut .../>
        <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue .../>
      </Component>
    </ComponentGroup>
    <ComponentGroup Id="DependencyComponents" Directory="INSTALLFOLDER" Source=...>
      <Component Id="log4net">
        <File Name="log4net.dll" />
      </Component>
        ...
    </ComponentGroup>
    <ComponentGroup Id="ResourcesComponents" Directory="ResourcesFolder" Source=...>
      <Component Id="logo.ico">
        ...
    </ComponentGroup>
    </Fragment>
</Wix>

【问题讨论】:

  • 所以您现在有一个 MSI,但是作为 MSI 一部分的文件没有打包到一个文件中 - 这是您要解决的问题吗?
  • @Isaiah4110 是的,完全正确。如果最终捆绑包不是 MSI 而是 EXE 或类似的东西,也可以。
  • 如果以下建议有效,请告诉我。
  • 嗨 Theo,稍微更新了我的答案。没有什么革命性的。

标签: .net wix 64-bit


【解决方案1】:

单文件部署?:我有点不确定这是否是您所要求的,但您似乎希望将所有 dll 嵌入到单个 .NET 中可执行文件?


Ilmerge.exe这不是我的专业领域,但有这个答案:Embedding DLLs in a compiled executable,您可以查看.工具Ilmerge.exe - how-to(另见下面的答案)。模型:

ILMerge.exe /target:winexe /out:All.exe Main.exe one.dll two.dll

我从来没有用过这个。如果它适用于所有情况,我会感到非常惊讶。明显地。值得一试?使用virustotal.com(发布模式二进制文件)测试合并的二进制文件,以确定是否触发任何恶意软件警告。

资源文件嵌入:您还可以在 .NET 可执行文件中嵌入资源文件,例如图像、html 模板和其他内容,如果您需要的话。只是我能找到的最简单的模型 (source):

  • 添加文件 TestFile.txt 作为嵌入资源:Project Menu >> Properties >> Resources >> Add Existing file.

  • 代码访问:string queryFromResourceFile = Properties.Resources.Testfile.ToString();

共享项目:.NET 项目/C# 类型存在难以捉摸的“Shared Project”,它会在构建时编译到您的主可执行文件中。不确定这个项目类型是什么时候出现的。它存在于 VS2017 中。

单个项目选项:您显然也可以将所有代码文件移动到同一个项目中并以这种方式编译可执行文件。除非您打算将所有源文件永久保存在一个项目中,否则我不会这样做。否则你会得到一个非常愚蠢的构建过程?我想应该提到所有选项,所以我们记住或承认它们为什么不好。

更多选择?:我相信还有更多选择。可能是我不知道的编译器的一些标志。有知道的请补充。 Found this somewhat crazy approach on youtube(设置要嵌入到Visual Studio项目中的dll资源,然后添加代码读取嵌入的程序集)。不知杀毒软件如何判断后者?使用virustotal.com(发布模式二进制)进行测试。我猜与 Ilmerge.exe 合并的二进制文件也是如此。


链接

【讨论】:

    【解决方案2】:

    请将Media Element 添加到您的 WXS 文件中 package 元素的正下方,这样应该可以解决问题。

    <Media Id="1" Cabinet="simple.cab" EmbedCab="yes" />
    

    【讨论】:

    • 这和&lt;MediaTemplate EmbedCab="yes"/&gt;的效果不一样吗? .cab 文件已经与安装程序打包在一起,问题是一旦安装程序运行所有 .dll 文件都没有捆绑。
    • 我在您的代码中错过了这一点,因为它位于升级元素的下方。但是是的,如果你使用的是wix3.8或更高版本,它应该具有相同的效果。
    • 我不明白 - 一旦安装程序运行,您所说的 DLL 未捆绑是什么意思?
    • 在安装目录中,我将应用程序 .exe 和一堆 .dll 放在一起,理想情况下,我希望它只是一个包含所有依赖项的单个 .exe 文件。跨度>
    • 看来您对 MSI 的功能有一个基本的误解。 MSI 只是您告诉它打包的东西的打包器,然后它将部署这些文件。基本上将 MSI 视为一个 zip 文件,它会压缩您要求的所有文件,然后将它们解压缩到目标位置。
    猜你喜欢
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2018-08-04
    • 2019-12-12
    相关资源
    最近更新 更多