6 Stimmen

Wix !(bind.AssemblyFullName.fileId) funktioniert nur bei GACed Assemblies?

Wehe, wehe und dreimal wehe. Warum macht Wix die Installation von .NET-Assemblies SOOOOOO schwierig!

Ich installiere einen COM Inprocess Server, der in .NET implementiert ist, in meiner Wix-Installation muss ich die Registry-Einträge dafür erstellen. Ich WILL das nicht tun, mir wäre es lieber, Wix hätte ein Äquivalent zu RegAsm, aber sie zwingen mich, das manuell zu tun. Ich hatte es satt, für meine Behauptung, das sei ein bisschen geheimnisvoll, angefeindet zu werden, also habe ich aufgegeben und versucht, es auf deklarative Weise zu tun, wie ein guter Junge. So sieht mein Registrierungskram jetzt aus:

<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 ist etwas für Weicheier, oder? Jedenfalls muss ich den vollständigen Namen der Baugruppe erhalten, um einige der Registrierungsschlüssel zu erstellen. Ich verwende insbesondere Binder-Variablen, Value="!(bind.AssemblyFullName.filDriverAssembly)" .

Dies funktioniert jedoch nicht, es sei denn, ich füge das Attribut Assembly=".net" zum Dateieintrag. Wenn ich dieses Attribut nicht hinzufüge, oder wenn ich Assembly="no" dann erhalte ich

Fehler 2 Ungelöst !(bind.AssemblyFullName.filDriverAssembly).

Wenn ich Folgendes hinzufüge Assembly=".net" zum Dateielement, dann funktionieren die Binder-Variablen einwandfrei, aber Wix legt meine Assembly in den Global Assembly Cache, der NICHT was ich will! Oh, Mann.

Ist es nicht möglich, den vollen Namen einer Baugruppe in einem Wix-Projekt abzufragen, wenn diese nicht in den GAC geht? Warum hängen diese beiden Dinge voneinander ab?

7voto

Bob Arnson Punkte 20005

Wenn eine Datei nicht als Assembly gekennzeichnet ist, ist sie wie jede andere Datei; WiX hat keine Ahnung, dass sie Assembly-Attribute haben könnte. Sehen Sie sich das Attribut AssemblyApplication an: Sie können es auf eine entsprechende Datei setzen und @Assembly=".net" angeben, ohne MSI mitzuteilen, dass die Datei in den GAC aufgenommen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X