Как добавить C# методы в существующий большой скрипт wix - PullRequest
1 голос
/ 25 февраля 2020

У нас есть существующий скрипт wix, который довольно сложный и длинный. Все пользовательские действия выполняются с помощью встроенного vbscript.

Я хочу переключить некоторые из этих действий с vbscript на C#. Все примеры везде начинаются с "создать проект wix в VisualStudio ...". Есть ли какой-нибудь пример того, как добавить код C# в существующий проект wix? Тот, где он построен с использованием старых приложений для командной строки wix?

1 Ответ

1 голос
/ 25 февраля 2020

Сначала бесстыдная реклама пользовательских действий C ++! : -).


Шаг -По шагу : я попробую, пожалуйста попробуйте это (вы можете перейти к нижнему источнику, если вы как-то сделали с этими предварительными шагами - это пошагово для реального и очень медленного перехода к действию - вы можете получить то, что вам нужно, прямо из источника WiX):

  1. В решении WiX Visual Studio, right click solution node at top => Add => New Project...
  2. Разверните узел WiX Toolset, выберите v3 (при условии, что вы используете версию WiX)
  3. Дважды щелкните "C# Custom Action Project for WiX v3"
  4. Щелкните правой кнопкой мыши "References" в проекте WiX (не в проекте C#) => Add Reference...
  5. Go "Projects" и добавьте ссылку на C# project (двойной щелчок и ОК)
  6. Выполните тестовую сборку. При условии, что не было ошибок, прежде чем их не должно быть сейчас.
  7. Вы должны увидеть что-то вроде "CustomAction1.CA.dll" в окне вывода сборки. Суффикс *.CA.dll добавляется в DLL-оболочку win32 для исходного управляемого кода DLL. Все это обрабатывается самим WiX - или фактически интеграцией Votive Visual Studio для WiX - просто знайте разницу:

    • "CustomAction1.dll" - управляемый код DLL.
    • "CustomAction1.CA.dll" - нативная библиотека оболочки win32, содержащая нативный и несколько других компонентов. Include this version in your MSI.
  8. Добавьте следующий фрагмент:

    <Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />
    
  9. Выше следует скомпилировать фактический C# DLL в MSI. Вы можете открыть MSI в Orca и увидеть в двоичной таблице.

  10. Это не очень хорошо, но я хотел бы добавить ссылку на System.Windows.Forms и использовать MessageBox.Show, чтобы показать диалоговое окно из настраиваемого действия, чтобы убедиться, что оно работает должным образом. Я также добавляю команду запуска отладчика приложения для dll, встроенных в режим отладки. Таким образом, Visual Studio будет автоматически вызываться (если все работает правильно), чтобы можно было пошагово выполнить код.
  11. Добавьте ссылку на "System.Windows.Forms", щелкнув правой кнопкой мыши ссылку C# проекта. узел, а затем добавьте "System.Windows.Forms". Также добавьте "using System.Windows.Forms;" в начало исходного файла - см. Полный исходный код ниже. Необходимо помнить ссылку "System.Windows.Forms" на уровне проекта.
  12. Теперь добавьте это в качестве тестового кода в проект настраиваемого действия "CustomAction1" Фрагмент кода пользовательского действия (см. раздел кода в нижней части для полного источника):

      // will launch the debugger for debug-build dlls
      #if DEBUG
        System.Diagnostics.Debugger.Launch();
      #endif
    
      MessageBox.Show("hello world");
    
  13. Чтобы получить стандартную настройку GUI (для тех, кто читает это), добавьте ссылку на WiXUIExtension как объяснено здесь (это шаг за шагом для создания базового c WiX-проекта, который компилируется и имеет GUI), а затем вставляет это в ваш источник:

    <UIRef Id="WixUI_Mondo" />
    
  14. Мне нравится менять <MediaTemplate /> на <MediaTemplate EmbedCab="yes" />, чтобы избежать внешних файлов cab с исходным кодом (с этим изменением cabs скомпилированы в MSI).

  15. Если у вас нет добавленных компонентов, вы можете добавить это, чтобы включить notepad.exe в MSI для тестовой установки в каталоге INSTALLFOLDER (просто хитрость для установки чего-либо без наличия исходных файлов - исходный путь, который должен быть разрешен на любой машине) - rep зашнуруйте весь раздел "TODO" - см. полный источник ниже:

    <Component Feature="ProductFeature">
      <File Source="C:\Windows\Notepad.exe" />
    </Component>
    
  16. Теперь нам нужно объявить собственное пользовательское действие и вставить его в последовательность установки. Давайте добавим это к предыдущему <Binary> element:

    <CustomAction Id="CA1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>
    
    <InstallUISequence>
      <Custom Action="CA1" After="CostFinalize" />
    </InstallUISequence>
    
    <InstallExecuteSequence>
      <Custom Action="CA1" After="CostFinalize" />
    </InstallExecuteSequence>
    
  17. Теперь соберите и протестируйте MSI. Вы должны получить множество "hello world" сообщений.

  18. Это общее "heartbeat" настраиваемого действия C# / управляемого кода - способ Я иногда использую их.

Фактический источник WiX : И теперь, синтез - не забудьте заменить все GUID! :

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="DemoCA" Language="1033" Version="1.0.0.0" Manufacturer="test" UpgradeCode="0adf972a-5562-4a6f-a552-dd1c16761c55">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate EmbedCab="yes" />

    <UIRef Id="WixUI_Mondo" />

 <!-- START CUSTOM ACTION CONSTRUCTS -->

    <Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />

    <CustomAction Id="CA1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>

    <InstallUISequence>
      <Custom Action="CA1" After="CostFinalize" />
    </InstallUISequence>

    <InstallExecuteSequence>
      <Custom Action="CA1" After="CostFinalize" />
    </InstallExecuteSequence>

 <!-- END CUSTOM ACTION CONSTRUCTS -->

    <Feature Id="ProductFeature" Title="AddingCSharpCustomActions" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
               <Directory Id="INSTALLFOLDER" Name="AddingCSharpCustomActions"/>
            </Directory>
        </Directory>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">

         <Component Feature="ProductFeature">
           <File Source="C:\Windows\Notepad.exe" />
         </Component>

        </ComponentGroup>
    </Fragment>
</Wix>

Краткое описание : краткая сводка необходимых изменений:

  1. Установить в поле производителя что-то.
  2. Добавить и измените конструкции пользовательских действий, как указано выше.
  3. Добавьте элементы Component / File по направлению вниз, заменив там раздел «TODO».
  4. Установите MediaTemplate для использования встроенные кабины, как описано выше (необязательно, не обязательно для работы образца).

Код настраиваемого действия : И, наконец, фактический C# тестовый код настраиваемого действия - обновлен Debugger.Launch, который запустит отладчик для библиотеки отладочной сборки. Затем вы можете присоединить отладчик к правильному исходному проекту и выполнить пошаговый код:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;
using System.Windows.Forms;

namespace CustomAction1
{
    public class CustomActions
    {
        [CustomAction]
        public static ActionResult CustomAction1(Session session)
        {

#if DEBUG
            System.Diagnostics.Debugger.Launch();
#endif

            MessageBox.Show("hello world");

            session.Log("Begin CustomAction1");

            return ActionResult.Success;
        }
    }
}

Ссылки :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...