Горе, горе и трижды горе.Почему 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?Почему эти две вещи зависят друг от друга?