Как создать интернет-ярлык с WixSharp

Я использую WixSharp, чтобы собрать установщик. Я хотел бы иметь ярлык в меню Program Files\, чтобы открыть веб-страницу. Могу ли я сделать это с WixSharp?

3 ответа

В WixSharp вы можете создать InternetShortcut через класс InternetShortcut .

Ниже приведен пример из приложения, над которым я работаю, добавления ссылки на веб-сайт со значком через InternetShortcutclass и разместить эту ссылку как на рабочем столе, так и в меню «Пуск».

      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

http://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/create_internet_shortcut.html

Подход чистого WiX XML-инъекций для ярлыков имеет то преимущество, что дает вам немного больше контроля над тем, что создается.

В примерах Wix # есть пример в Samples\InjectXML\Setup.cs, который также демонстрирует эту технику.

Взгляните на \Samples\Shortcuts в загружаемых файлах.

Другие вопросы по тегам