Frage

Ich habe eine App Ich habe mit einigen .Net4 Baugruppen aktualisiert, einschließlich der benutzerdefinierten Aktionen .dll, die ausgeführt wird, wenn die Anwendung deinstalliert werden soll. Die App wurde zunächst mit .NET 3.5 installiert und es erfordert einige benutzerdefinierten Aktionen bei der Installation und Deinstallation.

Das Problem ist, dass jetzt bei der Deinstallation der DLL der benutzerdefinierten Aktionen auf seine Net-4-Version geändert hat, und ich bin ein immer System.BadImageFormatException: Datei konnte nicht geladen werden oder Montage ‚X‘ oder eine ihrer Abhängigkeiten. Diese Anordnung wird durch einen eingebauten Laufzeit neuer als die aktuell geladene Laufzeit und kann nicht geladen werden. Datei Name: 'X'

weiß Hat jemand einen Weg, um das Deinstallationsprogramm zu erzählen zu beginnen 3.5 den Prozess mit .Net 4 statt Aufruf .Net die benutzerdefinierten Aktionen DLL zu laden? Woher kommt diese Deinstallationsinformationen für jedes Produkt gespeichert? und wie?

War es hilfreich?

Lösung 3

Nach einer langen Forschung fand ich einen Weg, um das Problem zu lösen. Ich habe eine Version der Anwendung auf .NET 4 und das Installationsprogramm erzeugt. Installiert es und dann verglichen, um die .msi-Datei der Anwendung auf dem C speichert: \ Windows \ Installer-Ordner mit der vorherigen Version der gleichen Datei aber mit .Net 3.5 (Originalinstallation). Dann öffnen Sie die beiden Dateien mit Orcas und einige Eigenschaftswerte und ein paar Binärdateien auf der .Net 3.5 msi-Datei von der neuen .Net 4 msi-Datei geändert.
Wenn ich jetzt mache eine Aktualisierung von einzelnen Dateien in der App zu einer .NET-4-Version von ihnen (so die App läuft unter .Net 4) Ich auch ändern muß, dass Deinstallation .msi-Datei unter C: \ Windows \ Installer und dann wenn das Windows Installer-Deinstallation wird .Net 4 aufrufen, um die benutzerdefinierte Aktionen statt .Net 3.5, die die ursprünglichen Build zu tun war, wenn die App installiert wurde.

Hier ist ein Skript, das den Prozess und keine Notwendigkeit, den Einsatz Orcas automatisiert, sondern nur die msi-Datei zu ändern geben und die beiden notwendigen DLL (die ich aus der msi der .Net-4-Version extrahiert).

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();

Die InstallUtil DLL-Datei gefunden auf dem .Net-Verzeichnis unter c werden kann: \ Windows für die Version 4.0, die zweite benannte MSVBDPCADLL ist immer noch ein Rätsel für mich, aber ich konnte es aus dem MSI des erzeugten extrahieren .Net 4 (es kann für 32 und 64 Versionen Unterschiede, wahrscheinlich müssen Sie die verschiedenen Versionen des DLLs extrahieren)

Andere Tipps

Hallo Um eine bestimmte Version des .NET-Frameworks für eine ausführbare Datei namens app.exe Ziel, können Sie diese Zeilen setzen:

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

in eine Datei app.exe.config dicht an der ausführbaren Datei benannt. Wenn die Datei bereits vorhanden ist, fusionieren nur die beiden xmls (EDIT: I ‚v4.0.30319‘ setzen, weil dies die Version ist, dass ich auf meinem Computer, aber Sie sollten die, die Sie gesetzt haben, sehen Sie% windir% \ Microsoft. NET \ Framework oder% windir% \ Microsoft.NET \ Framework64 es zu bekommen).

Vielleicht wissen Sie nicht den Namen der ausführbaren Datei, die Software zu deinstallieren. In diesem Fall können Sie den Einsatz Process Explorer versuchen Sie es (http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx) zu finden.

Aber Vorsicht: Dadurch wird das .NET FX Ziel aller Läufe mit dem gleichen Prozess ändern, damit (vielleicht) das Verhalten alle mit diesem Deinstallationsprogramm

getan Deinstallation ändern

Was Version von Windows Installer verwenden Sie? Ich kann nicht sicher sagen, aber ich frage mich, ob Sie eine ältere Version des Installers verwenden, dass will den 3.5-Framework verwenden.

Um zu überprüfen, Blick auf den Eigenschaften für das Setup-Projekt. Klicken Sie unter „Voraussetzungen“, und scrollen Sie nach unten im Dialog. Überprüfen Sie die Version, die Sie für den Installationsprozess verwendet werden soll.

Ehrlich gesagt, ich habe dieses Problem nie gehabt / bemerkt, aber ich frage mich, ob der neuere Windows Installer verwenden, es würde zu beheben.

Hallo, SO!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top