Как создать интернет-ярлык с WixSharp
Я использую WixSharp, чтобы собрать установщик. Я хотел бы иметь ярлык в меню Program Files\, чтобы открыть веб-страницу. Могу ли я сделать это с WixSharp?
3 ответа
В WixSharp вы можете создать InternetShortcut через класс InternetShortcut .
Ниже приведен пример из приложения, над которым я работаю, добавления ссылки на веб-сайт со значком через
InternetShortcut
class и разместить эту ссылку как на рабочем столе, так и в меню «Пуск».
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"
})
);
Смотрите также:
Используйте функцию внедрения Wix# XML для размещения кода WiX для ярлыка Интернета в вашей сборке. Используя этот пример синтаксиса WiX для ярлыка Интернета:
<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>
Таким образом, чтобы добавить туда ярлык Интернета, вы бы хотели, чтобы полученный 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, который также демонстрирует эту технику.