Wix! (Bind.AssemblyFullName.fileId) работает только на сборках GACed? - PullRequest
6 голосов
/ 17 июля 2011

Горе, горе и трижды горе.Почему Wix затрудняет установку сборок .NET SOOOOOO!

Я устанавливаю COM Inprocess Server, который реализован в .NET, в моей установке Wix мне нужно создать записи реестра для него.Я не хочу этого делать, я бы предпочел, чтобы у Wix был эквивалент RegAsm, но они заставляют меня делать это вручную.Я устал от того, что меня разозлили за то, что я предположил, что это немного загадочно, поэтому я сдался и попытался сделать это декларативным способом, как хороший мальчик.Итак, вот как теперь выглядит мой реестр:

<File Id="filDriverAssembly" Source="$(var.TiGra.Astronomy.AWRDriveSystem.TargetPath)" KeyPath="yes" Vital="yes" Assembly=".net">
  <!--<Class Context="InprocServer32" Description="$(var.InstallName)" Id ="$(var.DriverGuid)" ThreadingModel ="both" >
    <ProgId Description="$(var.InstallName)" Id ="$(var.DriverId)" />
  </Class>-->
</File>
<RegistryKey Root="HKCR" Key="$(var.DriverId)"  Action="createAndRemoveOnUninstall">
  <RegistryValue Type="string" Value="$(var.DriverTypeName)"/>
  <RegistryKey Key="CLSID">
    <RegistryValue Type="string" Value="$(var.DriverGuid)" />
    <RegistryKey Key="$(var.DriverGuid)">
      <RegistryValue Type="string" Value="$(var.DriverTypeName)"/>
      <RegistryKey Key="InprocServer32">
        <RegistryValue Type="string" Value="mscoree.dll" />
        <RegistryValue Type="string" Name="ThreadingModel" Value="Both"/>
        <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/>
        <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/>
        <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/>
        <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" />
        <RegistryKey Key="!(bind.fileVersion.filDriverAssembly)" >
          <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/>
          <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/>
          <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/>
          <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" />
        </RegistryKey>
      </RegistryKey>
      <RegistryKey Key="ProgId">
        <RegistryValue Type="string" Value="$(var.DriverId)" />
      </RegistryKey>
      <RegistryKey Key="Implemented Categories">
        <RegistryKey Key="{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" />
      </RegistryKey>
    </RegistryKey>
  </RegistryKey>
</RegistryKey>
<!-- Wow6432Node for x86 compatibility, installed only on x64 systems -->
<!-- HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node -->
<?if $(var.Win64) = "yes" ?>
<RegistryKey Root="HKCR" Key="Wow6432Node" Action="createAndRemoveOnUninstall">
  <RegistryKey Key="CLSID">
    <RegistryValue Type="string" Value="$(var.DriverGuid)" />
    <RegistryKey Key="$(var.DriverGuid)">
      <RegistryValue Type="string" Value="$(var.DriverTypeName)"/>
      <RegistryKey Key="InprocServer32">
        <RegistryValue Type="string" Value="mscoree.dll" />
        <RegistryValue Type="string" Name="ThreadingModel" Value="Both"/>
        <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/>
        <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/>
        <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/>
        <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" />
        <RegistryKey Key="!(bind.assemblyVersion.filDriverAssembly)" >
          <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/>
          <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/>
          <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/>
          <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" />
        </RegistryKey>
      </RegistryKey>
      <RegistryKey Key="ProgId">
        <RegistryValue Type="string" Value="$(var.DriverId)" />
      </RegistryKey>
      <RegistryKey Key="Implemented Categories">
        <RegistryKey Key="{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" />
      </RegistryKey>
    </RegistryKey>
  </RegistryKey>
</RegistryKey>
<?endif ?>

RegAsm для слабаков, а?В любом случае, обратите внимание, что мне нужно получить полное имя сборки для создания некоторых ключей реестра.Я использую переменные связующего, в частности, Value="!(bind.AssemblyFullName.filDriverAssembly)".

Это, однако, не работает, если я не добавлю атрибут Assembly=".net" к записи файла.Если я не добавлю этот атрибут или если я использую Assembly="no", я получу

Ошибка 2 Неразрешенная переменная времени привязки! (Bind.AssemblyFullName.filDriverAssembly).

Когда я добавляю Assembly=".net" к элементу файла, переменные связывателя работают просто отлично, но Wix помещает мою сборку в глобальный кэш сборок, который НЕ , что я хочу!О, чувак.

Разве нельзя запросить полное имя сборки в проекте Wix, если она не входит в GAC?Почему эти две вещи зависят друг от друга?

1 Ответ

7 голосов
/ 17 июля 2011

Если файл не помечен как сборка, он похож на любой другой файл;WiX не подозревает, что может иметь атрибуты сборки.Проверьте атрибут AssemblyApplication: вы можете установить для него соответствующий файл и установить @Assembly = ". Net", не сообщая MSI, что файл поступает в GAC.

...