我正在为具有许多依赖项的.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>
答案 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" />