Wix! (Bind.AssemblyFullName.fileId) работает только на сборках GACed?

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

Я устанавливаю 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? Почему эти две вещи зависят друг от друга?

6
задан Tim Long 17 July 2011 в 00:48
поделиться