我正在尝试使用WiX v3.7为Windows应用程序创建一个安装程序项目(因为VS2012不再包括设置和部署项目)用于学习目的.Wix工具集已集成到VS,我正在创建一个新的WiX单一安装程序设置项目.安装程序总是成功编译(除了图标扩展中的警告),它运行完美并且应该放置桌面快捷方式,但是无法在Windows 7 Professional x64 Service Pack 1上放置正确的开始菜单快捷方式.我在网上搜索并尝试过我几乎看到了什么,但到目前为止还没有成功.product.wxs文件如下所示,"my_guid"字符串由项目中的适当GUID替换.显然我错过了一点,但看不到哪里.也不会创建注册表项,因此最后一个片段可能由于某种原因而无法执行.怎么能解决这个问题?
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="my_guid" Name="WixSingleSetupExample" Language="1055" Version="1.0.0.0" Manufacturer="Can Yucel" UpgradeCode="my_guid">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="WixSingleSetupExample" Level="1">
<ComponentGroupRef Id="ProductComponents" />
<ComponentRef Id="ApplicationShortcut" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="DesktopFolder" Name="Desktop" />
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="WixSingleSetup"/>
</Directory>
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="WixSingleSetupExample" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Remove …Run Code Online (Sandbox Code Playgroud) 在我的自定义Burn托管引导程序应用程序中,我想要一种方法来设置安装程序的默认日志目录,以便客户可以轻松找到安装日志.如果无法做到这一点,我想在安装后以合适的方式复制日志文件.
我尝试在我的安装项目(即Bundle.wxs)和我的托管引导程序应用程序中设置WixBundleLog变量时失败.此外,我的bootstrapper应用程序是通用的,所以我可以使用各种产品/安装包,所以我需要一个足够灵活的解决方案来设置/获取每个包的安装日志,而无需硬编码包名称在我的bootstrapper应用程序中.
似乎应该有一种方法可以在不强制用户在命令行上使用"-l"或"-log"的情况下执行此操作.
我写了一个我一直在使用的WiX自定义MBA,它嵌入了我安装所需的所有安装包(msis,cabs和exes).但是,我现在想制作一个轻量级的Web引导程序,它将下载需要安装的软件包.我以为你可以免费使用底层的WiX引导程序引擎,但我想我错了.
我尝试订阅ResolveSource事件以获取软件包的下载URL并将其下载到本地源位置,但是在此过程中似乎已经太晚了,因为我的安装失败并显示错误"无法解析文件源: "(即使下载成功).
我试过的样本:
private void OnResolveSource(object sender, ResolveSourceEventArgs e)
{
string localSource = e.LocalSource;
string downloadSource = e.DownloadSource;
if (!File.Exists(localSource) && !string.IsNullOrEmpty(downloadSource))
{
try
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(e.DownloadSource, e.LocalSource);
}
}
catch (ArgumentNullException ex)
{
e.Result = Result.Error;
}
catch (WebException ex)
{
e.Result = Result.Error;
}
}
}
Run Code Online (Sandbox Code Playgroud)