Question

J'ai une application que j'ai mis à jour avec des assemblées .Net4, y compris les actions personnalisées .dll qui fonctionne lorsque l'application va être désinstallée. L'application a été initialement installé avec .Net 3.5 et nécessite des actions personnalisées lors de l'installation et la désinstallation.

Le problème est que maintenant lors de la désinstallation du .dll des actions personnalisées ont changé à sa version .Net 4 et j'obtenir un System.BadImageFormatException: Impossible de charger le fichier ou l'assemblage « X » ou l'un de ses dépendances. Cet ensemble est construit par un exécution plus récent que le moteur d'exécution actuellement chargé et ne peut pas être chargé. Fichier nom: 'X'

Est-ce que quelqu'un connaît un moyen de dire le programme de désinstallation pour démarrer le processus avec .Net 4 au lieu d'appeler .Net 3.5 pour charger les actions personnalisées dll? Où ces informations désinstaller sont stockées pour chaque produit? et comment?

Était-ce utile?

La solution 3

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 Generated l'installateur. Installé et comparé le fichier .msi l'application enregistre sur 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é certaines valeurs de propriété et un couple de fichiers binaires sur le .Net 3.5 fichier msi du nouveau .Net 4 fichier msi.
Maintenant, quand je fais une mise à jour des fichiers individuels dans l'application d'une version .Net 4 d'entre eux (donc les pistes app sous .Net 4) Je dois aussi changer ce fichier .msi sous désinstallation situé c: \ Windows \ Installer puis lors de la désinstallation de Windows installer invoquera .Net 4 pour faire les actions personnalisées au lieu de .Net 3.5 qui a été la construction d'origine lorsque l'application a été installée.

Voici un script qui automatise le processus et pas besoin de Orcas d'utilisation, juste passer le fichier msi au changement et les deux nécessaires dll (que j'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 trouve 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 l'extraire de la MSI du produit .Net 4 (il peut y avoir des différences pour les versions 32 et 64, probablement vous aurez besoin d'extraire les différentes versions des DLLs)

Autres conseils

Bonjour Pour cibler une version spécifique du framework .NET pour un app.exe exécutable nommé, 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 xmls (EDIT: Je mets « v4.0.30319 » parce que c'est la version que j'ai sur mon ordinateur, mais vous devez 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 de désinstaller votre logiciel. Dans ce cas, vous pouvez essayer de l'explorateur de processus pour le retrouver (http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx).

Mais méfiez-vous: faire cela va changer la cible de FX .NET de toutes les courses avec le même processus, d'où (peut-être) changer le comportement de tous désinstaller fait avec ce programme de désinstallation

Quelle version de Windows Installer utilisez-vous? Je ne peux pas dire à coup sûr, mais je me demande si vous utilisez une ancienne version de l'installateur que veut pour utiliser le Framework 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 vous utilisez le plus récent Windows Installer fixerait.

Bonjour, SO!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top