2010-10-27 26 views
0

J'ai une application que j'ai mise à jour avec certains assemblys .Net4, y compris les actions personnalisées .dll qui s'exécute lorsque l'application va être désinstallée. L'application a été initialement installée avec .Net 3.5 et nécessite des actions personnalisées lors de l'installation et de la désinstallation.Windows installateur appelant .Net3.5 pour exécuter un assembly .Net 4

Le problème est que maintenant lors de la désinstallation du .dll des actions personnalisées ont changé à son .Net version 4 et je reçois un System.BadImageFormatException: Impossible de charger le fichier ou l'assemblage « X » ou l'un des ses dépendances. Cet assembly est généré par un runtime plus récent que le runtime actuellement chargé et ne peut pas être chargé. Fichier nom: 'X'

Est-ce que quelqu'un sait un moyen de dire au programme de désinstallation de démarrer le processus avec .Net 4 au lieu d'appeler .Net 3.5 pour charger les actions personnalisées Dll? Où cette information de désinstallation est-elle stockée pour chaque produit? et comment?

Répondre

0

Après une longue recherche, je trouve un moyen de résoudre le problème. J'ai fait une version de l'application sur .Net 4 et généré l'installateur. L'a installé puis comparé le fichier .msi que l'application enregistre dans le dossier C: \ Windows \ Installer avec la version précédente du même fichier mais avec .Net 3.5 (installation d'origine). Ensuite, ouvrez les deux fichiers avec Orcas et changé quelques valeurs de propriété et quelques fichiers binaires sur le fichier .Net 3.5 msi à partir du nouveau fichier .Net 4 msi.
Maintenant, quand je fais une mise à jour des fichiers individuels dans l'App à une version .Net 4 d'entre eux (donc l'application fonctionne sous .Net 4) J'ai également besoin de changer ce fichier .msi désinstallation situé sous c: \ Windows \ Installer puis, lors de la désinstallation de Windows Installer, vous appelez .Net 4 pour effectuer les actions personnalisées au lieu de .Net 3.5, qui était la version d'origine lors de l'installation de l'application.

Voici un script qui automatise le processus et pas besoin d'utiliser les orques, il suffit de passer le fichier msi pour le modifier et les deux Dll nécessaires (que j'ai extrait du msi de la version .Net 4).

var installer=new ActiveXObject("WindowsInstaller.Installer"); 
var db; 
var msiOpenDatabaseModeTransact = 1; 
var msiFile = WScript.Arguments.Item(0); 
var installbuildfile = WScript.Arguments.Item(1); 
var auxDllFile = WScript.Arguments.Item(2); 
database = installer.OpenDatabase(msiFile, msiOpenDatabaseModeTransact); 

    var view = database.OpenView("SELECT Name,Data FROM Binary"); 
    view.Execute(); 
    var rec; 
    for (rec = view.Fetch(); rec != null; rec = view.Fetch()) { 
     WScript.echo("Current SmartUpdater.exe version is: "+rec.StringData(1)); 
     if (rec.StringData(1) == "InstallUtil") { 
      rec.SetStream(2, installbuildfile); 
      view.Modify(2, rec) 
      WScript.echo("Changed: " + rec.StringData(1)); 
     } 
     if (rec.StringData(1) == "MSVBDPCADLL") { 
      rec.SetStream(2, auxDllFile); 
      view.Modify(2, rec) 
      WScript.echo("Changed: " + rec.StringData(1)); 
     } 
    } 
    view.Close(); 
    view = database.OpenView("UPDATE Property SET Value='v4.0' WHERE Property='VSDFrameworkVersion'"); 
    view.Execute(); 
    view.Close(); 

database.Commit(); 

Le fichier dll InstallUtil se trouvent dans le répertoire .Net sous c: \ Windows pour la version 4.0, le second nommé MSVBDPCADLL est encore un mystère pour moi, mais je pourrais extraire du MSI le .Net 4 généré (il peut y avoir des différences pour les versions 32 et 64, probablement vous devrez extraire les différentes versions des Dll)

0

Bonjour Pour cibler une version spécifique du framework .NET pour un exécutable nommé app.exe, vous pouvez mettre ces lignes:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0.30319"/> 
    </startup> 
</configuration> 

dans un fichier nommé app.exe.config proche de l'exécutable . Si le fichier existe déjà, il suffit de fusionner les deux xml (EDIT: je mets 'v4.0.30319' parce que c'est la version que j'ai sur mon ordinateur, mais vous devriez mettre celui que vous avez, regardez% WINDIR% \ Microsoft. NET \ Framework ou% WINDIR% \ Microsoft.NET \ Framework64 pour l'obtenir). Peut-être que vous ne connaissez pas le nom de l'exécutable qui désinstalle votre logiciel. Dans ce cas, vous pouvez essayer d'utiliser l'explorateur de processus pour le trouver (http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx). Mais attention: cela changera la cible .NET FX de toutes les exécutions avec le même processus, donc (peut-être) changer le comportement de toutes les désinstallations faites avec ce programme de désinstallation!

+0

le programme de désinstallation serait dans ce cas le msiexec qui n'est pas une application .Net. En regardant dans le registre de Windows, désinstallez les informations que je peux voir ce qui est en cours d'exécution .. msiexec/X {mon application GUID}. Msiexec crée en fait un processus .Net qui charge et exécute l'ensemble des actions personnalisées. L'ajout de ce fichier .config à msiexec ne modifie pas le processus .Net qu'il crée pour charger l'assembly et msiexec lui-même ne fonctionne plus à partir du CLR. – jmayor

+0

Je suppose que vous ne savez pas quel processus .net est créé? Pour le trouver, je suggère d'utiliser "Process Monitor" (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) et lui demander d'afficher tous les éléments liés à votre assembly fait avec fx 4.0. –

+0

J'ai testé un filtre sur Process Monitor qui semble fonctionner: ouvrez Process Monitor, utilisez le menu Filter \ Filter ..., choisissez dans les contrôles supérieurs Path \ contains \ \ Include, et cliquez sur le bouton "Ajouter" puis "ok". Tapez CTRL + X effacez tout l'affichage et lancez votre processus de désinstallation. Lorsque votre assembly est chargé, vous devriez avoir de nouvelles lignes dans les fenêtres de Process Monitor, regardez la colonne "Process Name" pour savoir quel processus utilise votre assembly. –

0

Quelle version du programme d'installation Windows utilisez-vous? Je ne peux pas dire avec certitude, mais je me demande si vous utilisez une ancienne version de l'installateur que veut pour utiliser le cadre 3.5.

Pour vérifier, regardez les propriétés du projet d'installation. Cliquez sur "Conditions préalables" et faites défiler vers le bas de la boîte de dialogue. Vérifiez la version que vous souhaitez utiliser pour le processus d'installation. Honnêtement, je n'ai jamais eu/remarqué ce problème, mais je me demande si l'utilisation de Windows Installer plus récent le résoudrait.

Hello, SO!

+0

Mon problème n'est pas avec des pré-requis. Il s'agit d'une application déjà installée avec des actions personnalisées qui, au moment où elle a été installée, avait un pré-requiste de .Net 3.5 à exécuter. Maintenant, les actions personnalisées dll ont changé pour une version .Net 4 et la version de désinstallation est en train de casser parce que j'essaie d'utiliser .Net 3.5 pour charger le nouvel assemblage – jmayor

+0

Je comprends cela. Je soulignais juste que * peut-être * en utilisant l'installateur plus récent aiderait ... peut-être pas je ne sais pas. Cette case à cocher est le seul moyen que je connaisse pour forcer la version de l'installateur à utiliser – Joe

+0

merci pour l'aide, je l'ai enfin réussi, regardez mes résultats – jmayor