wix wix3.7

WiX detectar.Net 4.0.3



wix3.7 (2)

Tengo una aplicación que requiere .Net 4.0.3 ( enlace ).

Encontré este artículo que me dice dónde encontraría la versión de .Net que está instalada pero todo lo que puedo encontrar es la lista de propiedades incluidas que el compilador de WiX reconoce ( aquí ).

Intenté seguir las instrucciones en este artículo , que me dice que use el siguiente código, pero esto simplemente instala .Net 4 sin la actualización:

<PropertyRef Id="NETFRAMEWORK40FULL"/> <Condition Message="This application requires .NET Framework 4.0.3. Please install the .NET Framework then run this installer again."> <![CDATA[Installed OR NETFRAMEWORK40FULL]]> </Condition>

¿Cómo podría hacer para que WiX compruebe la actualización 4.0.3 específica, ya sea a través de una propiedad WiX predefinida o revisando el valor del registro yo mismo?


Después de leerlo, terminé agregando un proyecto de paquete a mi solución que hace referencia a mi Product principal en el proyecto de instalador de WiX estándar ( MyProject.Installer ). Luego utilicé RegistrySearch para encontrar la versión de la instalación completa de .Net 4.

<Bundle ....> <Chain> <PackageGroupRef Id="Netfx4Full" /> <PackageGroupRef Id="Netfx403Update" /> <MsiPackage Id="MyMsi" SourceFile="$(var.MyProject.Installer.TargetPath)" Compressed="yes" DisplayInternalUI="yes" /> </Chain> </Bundle> <Fragment> <util:RegistrySearch Root="HKLM" Key="SOFTWARE/Microsoft/Net Framework Setup/NDP/v4/Full" Value="Version" Variable="Netfx4FullVersion" /> <util:RegistrySearch Root="HKLM" Key="SOFTWARE/Microsoft/Net Framework Setup/NDP/v4/Full" Value="Version" Variable="Netfx4x64FullVersion" Win64="yes" /> <PackageGroup Id="Netfx4Full"> <ExePackage Id="Netfx4Full" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" SourceFile="$(var.ProjectDir)dotNetFx40_Full_x86_x64.exe" DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193" DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" /> </PackageGroup> <PackageGroup Id="Netfx403Update"> <ExePackage Id="Netfx403Update" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" SourceFile="$(var.ProjectDir)NDP40-KB2600211-x86-x64.exe" DetectCondition="Netfx4FullVersion AND (Netfx4FullVersion &lt;&lt; &quot;4.0.3&quot; OR Netfx4FullVersion &lt;&lt; &quot;4.5&quot;)" /> </PackageGroup> </Fragment>

La condición se expande a Netfx4FullVersion AND (Netfx4FullVersion << "4.0.3" OR Netfx4FullVersion << "4.5") sin XML de escape.

Los siguientes artículos fueron útiles:

Código del esqueleto del paquete

Manifiesto del paquete Bundle

Definición de búsquedas usando variables de WiX

Encadenando paquetes en un paquete

Cómo verificar las versiones de .Net


El valor de versión dentro de la clave de registro "SOFTWARE/Microsoft/Net Framework Setup/NDP/v4/Full" siempre será 4.0.30319 para .net 4.0 (incluso si se han instalado actualizaciones).

Aquí está el código que he usado en mi paquete para buscar si la versión .net 4.0.3 ya estaba instalada:

<util:RegistrySearch Root="HKLM" Key="SOFTWARE/Microsoft/.NETFramework/v4.0.30319/SKUs/.NETFramework,Version=v4.0.3" Result="exists" Variable="Netfx403" /> <util:RegistrySearch Root="HKLM" Key="SOFTWARE/Microsoft/.NETFramework/v4.0.30319/SKUs/.NETFramework,Version=v4.0.3" Result="exists" Variable="Netfx403x64" Win64="yes" />

Luego, en su ExePackage DetectCondition:

DetectCondition="Netfx403 AND (NOT VersionNT64 OR Netfx403x64)"