2010-12-29 6 views
3

J'utilise Inno Setup pour générer le programme d'installation pour mon application, et je voudrais écrire un script NGen mon application lors de l'installation. Je veux le code pour pouvoir NGen fichiers ciblant x86, x64, ou AnyCPU. Je veux pouvoir NGen sur 32bit et 64bit systèmes. Comment puis-je atteindre cet objectif?Comment correctement NGen application .NET pendant l'installation

J'ai trouvé quelques liens utiles:
Getting the .NET Framework directory path
http://nsis.sourceforge.net/Get_directory_of_installed_.NET_runtime
Là où je l'ai trouvé est un problème assez complexe - il peut y avoir jusqu'à 4 différentes versions de NGen application:

  1. pour CLR 2.0 et les systèmes 32bits
  2. pour CLR 2.0 et les systèmes 64bit
  3. pour 4,0 CLR une nd systèmes 32bits
  4. pour CLR 4.0 et les systèmes 64 bits

Et il est encore plus compliquée par le fait que l'application peut cibler CPU 32 bits et exécuter sur le système 64 bits.


Alors ce qui est venu à mon esprit était une fonction qui ressemble à ceci:

function NGenFile(file: String; targetCPU: TTargetCPU; targetCLR: TTargetCLR): Boolean; 

et appeler quelque part dans [Code] après isntallation réussie:

NGenFile(ExpandConstant('{app}\application.exe'), tcpu64, tclr20); 
NGenFile(ExpandConstant('{app}\library1.dll'), tcpu64, tclr40); 
NGenFile(ExpandConstant('{app}\library2.dll'), tcpu32, tclr20); 
NGenFile(ExpandConstant('{app}\library3.dll'), tcpu32, tclr40); 
NGenFile(ExpandConstant('{app}\library4.dll'), tcpuAny, tclr20); 
NGenFile(ExpandConstant('{app}\library5.dll'), tcpuAny, tclr40); 

Et cela fonctionnerait comme ça :

  1. application.exe (tcpu64, tclr20)
    Le système 64 bits, il générerait image native cible CPU 64 bits et CLR 2.0, Résultat: = True
    Le système 32bits, il ne ferait rien, Résultat: = False

  2. library1.dll (tcpu64, tclr40)
    Le système 64 bits, il générerait image native cible CPU 64 bits et CLR 4.0, Résultat: = True
    Le système 32bits, il ne ferait rien, Résultat: = Faux

  3. library2.dll (tcpu32, tclr20)
    Le système 64 bits, il générerait image native cible CPU 32 bits et CLR 2.0, Résultat: = True
    Le système 32 bits, il ferait la même chose que sur le système 64bit

  4. library3.dll (tcpu32, tclr40)
    Sur le système 64 bits, il génère une image native ciblant le processeur 32 bits et le CLR 4.0, Résultat: = True
    Le système 32 bits, il ferait la même chose que sur le système 64bit

  5. library4.dll (tcpuAny, tclr20)
    Le système 64 bits, il générerait image native cible CPU 64 bits et CLR 2.0, Résultat: = True
    Le système 32 bits, il générerait image native cible CPU 32 bits et CLR 2.0, Résultat: = True

  6. library5.dll (tcpuAny, tclr40)
    Le système 64bit il serait g enerate image native ciblage CPU 64 bits et CLR 4.0, Résultat: = True
    Le système 32 bits, il générerait image native cible CPU 32 bits et CLR 4.0, Résultat: = True


Donc, pour le faire fonctionner , J'ai besoin de connaître 4 chemins différents vers le répertoire d'exécution .NET. Voilà ce que j'ai trouvé:

  1. système 32bit CLR 2.0
    valeur Get de "InstallRoot" dans "HKLM \ Software \ Microsoft \ .NETFramework", sauf valeur1
    Obtenir le nom d'abord valeur dans "HKLM \ Software \ Microsoft \ .NET Framework \ Policy \ v2.0", enregistrez à value2
    value1 + "v2.0". + value2 + "\ ngen.exe" => win
    Exemple: "c: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ ngen.exe"
    Je suppose que cela fonctionnera de la même manière sur les systèmes 32 bits et 64 bits

  2. système 32bit CLR 4.0
    valeur Get de "InstallRoot" dans "HKLM \ Software \ Microsoft \ .NETFramework", sauf valeur1
    Obtenir le nom de la première valeur dans « HKLM \ Software \ Microsoft \. NETFramework \ Policy \ v4.0 ", enregistrer en valeur2
    value1 +" v4.0. " + value2 + "\ ngen.exe" => win
    Exemple: "c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ ngen.exe"
    Je suppose que cela fonctionnera de la même manière sur les systèmes 32 bits et 64 bits

  3. système 64bit CLR 2.0
    Comment obtenir InstallRoot pour .NET Framework 64 bits?
    Exemple: "c: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ ngen.exe"

  4. système 64bit CLR 4.0
    Comment obtenir InstallRoot pour .NET Framework 64 bits?
    Exemple: "c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ ngen.exe"

Je suis en fait pas sûr si la valeur "InstallRoot" sur les systèmes 64bit citerais InstallRoot de 32bit .NET, ou 64bit .NET, sont donc les 2 premières méthodes fiables pour tout système? Et comment ressemblerait à la deuxième 2 méthodes? Existe-t-il un moyen plus simple de réaliser tout cela?

Répondre

3

Quelle version d'InnoSetup utilisez-vous? Dans la version que j'utilise (5.4.0a), il y a déjà des constantes pour trouver le répertoire racine .NET. A partir de l'aide InnoSetup:

{dotnet20} Répertoire racine .NET Framework version 2.0. {dotnet20} correspond à équivalent à {dotnet2032} sauf si l'installation est en mode 64 bits , auquel cas elle est équivalente à {dotnet2064}.

Une exception sera générée si une tentative est faite pour développer cette constante sur un système sans .NET Framework version 2.0 présent.

{dotnet2032} Répertoire racine .NET Framework version 2.0 32 bits.

Une exception sera générée si une tentative est faite pour développer cette constante sur un système sans .NET Framework version 2.0 présent.

{dotnet2064} 64 bits Windows uniquement: 64 bits .NET Framework version 2.0 répertoire racine.

Une exception sera levée si une tentative d'étendre cette constante sur un système sans version .NET Framework 2.0 présente.

{dotnet40} Répertoire racine .NET Framework version 4.0. {dotnet40} correspond à équivalent à {dotnet4032} sauf si l'installation s'exécute en mode 64 bits , auquel cas elle est équivalente à {dotnet4064}.

Une exception sera générée si une tentative est effectuée pour développer cette constante sur un système sans .NET Framework version 4.0 présent.

{dotnet4032} Répertoire racine .NET Framework version 4.0 32 bits.

Une exception sera générée si une tentative est effectuée pour développer cette constante sur un système sans .NET Framework version 4.0 présent.

{dotnet4064} 64 bits Windows uniquement: 64 bits .NET Framework version 4.0 répertoire racine.

Une exception sera générée si une tentative est effectuée pour développer cette constante sur un système sans .NET Framework version 4.0 présent.

+1

Merci! Complètement oublié à propos de ces ... +1. Cependant, savez-vous quand ces constantes sont résolues? Est-ce au premier essai d'étendre la constante, ou au démarrage de l'installation? – Paya

+0

Ma conjecture serait au démarrage de l'installation mais je n'ai pas essayé spécifiquement. – mirtheil

+0

C'est certainement la bonne approche. Je vais probablement réécrire le code à partir des sources d'Inno Setup et l'utiliser pour trouver ces répertoires, alors merci de souligner que ces constantes existent. :-) – Paya

Questions connexes