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)
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
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. –
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. –