2011-07-17 15 views
6

Ay, ay y tres veces ay. ¿Por qué Wix hace que la instalación de ensambles .NET SOOOOOO sea difícil!Wix! (Bind.AssemblyFullName.fileId) solo funciona en ensamblados GACed?

Estoy instalando un servidor de proceso de COM que está implementado en .NET, en mi instalación de Wix necesito crear las entradas de registro para él. NO QUIERO hacer esto, prefiero que Wix tenga un equivalente de RegAsm, pero me obligan a hacerlo manualmente. Me cansé de que me llamaran por sugerir que era un poco arcano, así que me rendí e intenté hacerlo de manera declarativa, como un buen chico. Por lo tanto, esto es lo que mis cosas Registro ve ahora:

<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 es para los débiles, eh? De todos modos, tenga en cuenta que necesito obtener el nombre completo de la asamblea para crear algunas de las claves de registro. Estoy usando variables de enlace, específicamente, Value="!(bind.AssemblyFullName.filDriverAssembly)".

Esto, sin embargo, no funciona a menos que agregue el atributo Assembly=".net" a la entrada del archivo. Si no añado ese atributo, o si uso Assembly="no", entonces consigo

error 2 variables no resuelto en tiempo se unen ! (Bind.AssemblyFullName.filDriverAssembly).

Cuando agrego Assembly=".net" al elemento archivo, entonces las variables de aglutinante funciona muy bien, pero mi Wix pone ensamblado en la caché de ensamblados global, que es NO lo que quiero! Oh hombre.

¿No es posible consultar el nombre completo de un conjunto en un proyecto Wix si no va al GAC? ¿Por qué estas dos cosas dependen unas de otras?

Respuesta

6

A menos que un archivo esté marcado como un ensamblaje, es como cualquier otro archivo; WiX no tiene idea de que pueda tener atributos de ensamblaje. Consulte el atributo AssemblyApplication: puede establecerlo en un archivo apropiado y establecer @Assembly = ". Net" sin indicar a MSI que el archivo va al GAC.

+0

No estoy seguro de cómo funciona esto de la documentación, ¿podría darnos un ejemplo? Ese atributo parece ser válido solo en la clave NativeAssembly, lo que obligaría a NGEN a generar ensamblajes nativos. No quiero NGEN la asamblea; es el mismo problema, todo tiene dos significados. Solo quiero que los metadatos de un ensamblaje se usen en otra parte del proceso de instalación. –

+0

Además, mi conjunto es un elemento de propósito general que será cargado por muchas aplicaciones, algunas de las cuales aún no existen. ¿Cómo debo especificar "la aplicación que cargará este ensamblaje"? –

+0

Estoy hablando del atributo File/@ AssemblyApplication. –

Cuestiones relacionadas