Сборка MSI для установки DLL и сделать его доступным из «Добавить ссылки» в VS - PullRequest
1 голос
/ 27 марта 2010

Я хотел бы создать установщик MSI, который устанавливает управляемую DLL и делает ее доступной для пользователей из меню «Добавить ссылки» Visual Studio в обозревателе решений. Я полагаю, что должен добавить ключ в реестр Windows, но не вижу, как сказать проекту VS для MSI сделать это при установке.

Как это сделать и где мне искать учебники по таким вещам?

1 Ответ

1 голос
/ 27 марта 2010

Перейти к следующему разделу реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders

Добавьте подраздел (имя которого не имеет значения, но также может быть описательным), чье значение по умолчанию - папка , содержащая ваши сборки, и вы должны быть готовы.

Как добавить нужный ключ с помощью WiX

Это урезанный фрагмент кода WiX для создания необходимого ключа и установки его значения по умолчанию для папки, в которую были установлены ваши сборки. Это не полный установщик WiX, и его нельзя вставить напрямую - я удалил атрибуты Guid и показал только объявления Справочника, Компонента и Функции. После того, как вы увидели полный код WiX, он должен быть достаточно понятным как объединить эти биты в.

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <!-- Path from WiX file to the DLL(s) you're installing -->
  <?define BuildPath="..\Bin\Release" ?>
  <!-- The base key path - note no HKLM -->
  <?define AssemblyFolders = "Software\Microsoft\.NETFramework\AssemblyFolders" ?>

  <Product>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="CompanyFolder" Name="YourCompany">
          <Directory Id="INSTALLLOCATION" Name="Your Product">
            <!-- Id="AssemblyFolder" captures the location where the DLL gets installed -->
            <Directory Id="AssemblyFolder" Name="Bin">
              <Component Id="AssemblyComponent">
                <!-- This is the bit that copies the assembly file -->
                <File Id="YourDll.dll" Checksum="yes" Source="$(var.BuildPath)YourDll.dll" />
              </Component>
              <Component Id="ControlRegistrationComponent">
                <!-- This is the bit that creates the registry key -->
                <RegistryKey Action="createAndRemoveOnUninstall" Root="HKLM" Key="$(var.AssemblyFolders)\Your Product Name">
                  <!-- Square brackets result in a reference -- so the install folder gets picked up -->
                  <RegistryValue Action="write" Value="[AssemblyFolder]" Type="string" />
                </RegistryKey>
              </Component>
            </Directory>
          </Directory>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="PRODUCTROOTFEATURE">
      <!-- This causes the assembly to be installed -->
      <ComponentRef Id="AssemblyComponent" />
      <!-- This causes the registry key to be created -->
      <ComponentRef Id="ControlRegistrationComponent" />
    </Feature>

  </Product>
</Wix>

Чтобы построить MSI, когда у вас есть полноценный скрипт WiX, вы можете использовать командный файл, ядро ​​которого выглядит следующим образом:

candle.exe "%WXS_NAME%.wxs" -out "%WXS_NAME%.wixobj"
light.exe "%WXS_NAME%.wixobj" -out "%WXS_NAME%.msi"

где% WXS_NAME% - имя исходного файла WiX .wxs.

(я понимаю, что это, вероятно, выглядит несколько загадочно, но (а) существует множество примеров, учебников и справочных материалов по WiX, которые помогут вам начать работу, и (б) надстройка Votive для Visual Studio может оградить вас от некоторые из кишок в любом случае.)

Для автоматической сборки MSI используйте надстройку Votive (часть WiX), либо шаг после сборки, либо сценарий сборки MSBuild. Мы используем скрипт сборки, потому что мы обычно хотим собирать MSI только как часть нашей автоматической сборки - выполнение этого после этапа сборки замедлит сборку разработки - но ваш пробег может отличаться.

...