Используйте функцию внедрения 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
http://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/create_internet_shortcut.html
Преимущество чистого WiX XML-инъекции для ярлыков будет иметь преимущество, позволяющее вам немного больше контролировать то, что создается.
В примерах Wix # есть пример в Samples \ InjectXML \ Setup.cs, который также демонстрирует эту технику.