我正在使用 WixSharp 来组装一个安装程序。我想在 Program Files\ 菜单中有一个快捷方式来打开网页。我可以用 WixSharp 做到这一点吗?
3 回答
查看可下载文件中的 <Wix#>\Samples\Shortcuts。
使用 Wix# XML 注入功能将 Internet 快捷方式的 WiX 代码放入您的构建中。使用此 WiX 语法示例作为 Internet 快捷方式:
<util:InternetShortcut Id="OnlineDocumentationShortcut"
Name="My Online Documentation"
Target="http://wixtoolset.org/"/>
在您的 Wix# 安装程序代码中,首先,在您的主代码中,您将向“WixSourceGenerated”事件添加一个处理程序,该事件在 .wxs 文件创建之后但在它编译之前触发。该代码如下所示:
// Hook up a delegate to the "WixSourceGenerated" event, fires when .wxs file is fully created
Compiler.WixSourceGenerated += InjectXMLElement;
// Make sure the .wxs file gets preserved
Compiler.PreserveTempFiles = true;
// Trigger the MSI file build
Compiler.BuildMsi(project);
然后在您的委托方法中,您将拥有如下所示的代码:
/// <summary>
/// Insert XML elements and attributes into the generated .wxs file
/// </summary>
/// <param name="document"></param>
static void InjectXMLElement(System.Xml.Linq.XDocument document)
{
// To add an Internet shortcut on target system, add this element:
// <util:InternetShortcut Id="OnlineDocumentationShortcut"
// Name="My Online Documentation"
// Target="http://wixtoolset.org/"/>
var componentElement = document.Root.Select("Product/Directory/Directory/Component");
componentElement.Add(new XElement("util:InternetShortcut",
new XAttribute("Id", "OnlineDocumentationShortcut"),
new XAttribute("Target", "http://wixtoolset.org/")));
}
您需要查看生成的 .wxs 文件,该文件与生成的 MSI 文件位于同一文件夹中,并找出 XPath 是什么,以便“document.Root.Select()”到达您所在的节点想要添加插入的 WiX XML。在我的 wxs 文件中,开始菜单快捷方式位于 XML 的一部分中,如下所示:
<Directory Id="ProgramMenuFolder" Name="ProgramMenuFolder">
<Directory Id="ProgramMenuFolder.My_App_Name" Name="My App Name">
<Component Id="My_App_Name.EmptyDirectory" Guid="18342da3-5a42-4397-b522-5927ace999">
<CreateFolder />
<RemoveFolder Id="ProgramMenuFolder.My_App_Name" On="uninstall" />
<RegistryKey Root="HKCU" Key="Software\WixSharp\Used">
<RegistryValue Value="0" Type="string" KeyPath="yes" />
</RegistryKey>
</Component>
</Directory>
因此,要在此处添加 Internet 快捷方式,您可能希望生成的 XML 看起来像这样:
<Directory Id="ProgramMenuFolder" Name="ProgramMenuFolder">
<Directory Id="ProgramMenuFolder.My_App_Name" Name="My App Name">
<Component Id="My_App_Name.EmptyDirectory" Guid="18342da3-5a42-4397-b522-5927ace999">
<CreateFolder />
<util:InternetShortcut Id="OnlineDocumentationShortcut"
Name="My Online Documentation"
Target="http://wixtoolset.org/"/>
<RemoveFolder Id="ProgramMenuFolder.My_App_Name" On="uninstall" />
<RegistryKey Root="HKCU" Key="Software\WixSharp\Used">
<RegistryValue Value="0" Type="string" KeyPath="yes" />
</RegistryKey>
</Component>
</Directory>
我认为这并不像我想象的那样困难或复杂。将 XPath 节点定位器指向插入 XML 的正确位置只需要一些试验和错误。另外,我注意到 Wix# XML 语法似乎与 WiX 有点不同(在这个“快捷方式”区域中不太完整)。(例如,Wix# 插入了一个 WiX 没有的元素,并且 WiX 允许您更清楚地指定快捷方式的开始文件夹和其他值)我使用的示例 XML 来自我拥有的添加开始菜单的 Wix# 安装程序捷径。如果您想为快捷方式做一个更纯粹的 WiX 方法,并使用这种方法将它们全部注入,然后参考这些 WiX 链接: http://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/create_start_menu_shortcut。 html
用于快捷方式的纯 WiX XML 注入方法的优点是允许您对所创建的内容进行更多控制。
在 Wix# 示例中,Samples\InjectXML\Setup.cs 中有一个示例也显示了这种技术。
在 WixSharp 中,您可以通过InternetShortcut类创建InternetShortcut。
下面是一个来自我正在开发的应用程序的示例,该示例通过InternetShortcut
类添加指向包含图标的网站的链接,并将该链接放置在桌面和开始菜单上。
var project = new Project("MyApplicationName", // Installer name
new Dir(@"%ProgramFiles%\MyApplicationName", // Install directory
new Files(@"..\MyApplicationName\bin\Release\netcoreapp3.1\publish\*.*")), // Source directory
new Dir(@"%ProgramMenu%\MyApplicationName",
new InternetShortcut
{
Name = $"Admin Page",
Target = "http://localhost:4444",
Type = InternetShortcut.ShortcutType.link,
AttributesDefinition = @"IconFile=[INSTALLDIR]\icon.ico;IconIndex=0"
},
new ExeFileShortcut
{
Name = "Uninstall",
Target = "[System64Folder]msiexec.exe",
Arguments = "/x [ProductCode]"
}),
new Dir(@"%Desktop%",
new InternetShortcut
{
Name = $"Admin Page",
Target = "http://localhost:4444",
Type = InternetShortcut.ShortcutType.link,
AttributesDefinition = @"IconFile=[INSTALLDIR]\icon.ico;IconIndex=0"
})
);
也可以看看: