如何在WiX中将依赖项.dll文件与主要产品捆绑在一起

时间:2019-01-15 16:25:19

标签: .net wix 64-bit

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

阅读WIX Bundle Creation的答案,似乎可以将我的产品保持在一个文件中,而将另一个文件与Bundle一起引用该产品,但是我似乎找不到任何示例。

有没有简单的方法可以做到这一点?我已经在下面包含了产品代码的概述。

<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>

2 个答案:

答案 0 :(得分: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(将dll资源设置为在Visual Studio项目中嵌入,然后添加代码以读取嵌入的程序集)。我想知道反病毒软件如何判断后者?使用virustotal.com(发布模式二进制文件)进行测试。我猜与Ilmerge.exe合并的二进制文件也是如此。


链接

答案 1 :(得分:0)

请将Media Element添加到package元素正下方的WXS文件中,这应该可以对其进行修复。

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