Domanda

Ho un app ho aggiornato con alcune assemblee .Net4, comprese le azioni personalizzate dll che viene eseguito quando l'applicazione sta per essere disinstallato. L'App è stato inizialmente installato con .Net 3.5 e richiede alcune azioni personalizzate durante l'installazione e la disinstallazione.

Il problema è che ora quando la disinstallazione del DLL delle azioni personalizzate sono cambiate alla sua versione .Net 4 e sto ottenendo un System.BadImageFormatException: Impossibile caricare il file o l'assembly 'X' o una delle sue dipendenze. Questo assemblaggio è costruito da una runtime più recente rispetto alla fase di esecuzione attualmente caricato e non può essere caricato. File Nome: 'X'

Qualcuno conosce un modo per dire al programma di disinstallazione per avviare il processo con .Net 4 invece di chiamare Net 3.5 per caricare le azioni personalizzate Dll? Da dove viene questa informazioni di disinstallazione vengono memorizzate per ogni prodotto? e come?

È stato utile?

Soluzione 3

Dopo una lunga ricerca ho trovato un modo per risolvere il problema. Ho fatto una versione dell'applicazione su Net 4 e generato l'installatore. Installato e poi confrontato il file con estensione msi l'applicazione salva sulla cartella C: \ Windows \ Installer con la versione precedente dello stesso file, ma con .Net 3.5 (installazione originale). Poi aprire entrambi i file con Orcas e ha cambiato alcuni valori di proprietà e un paio di file binari sul file MSI Net 3.5 dal nuovo file msi .Net 4.
Ora, quando faccio un aggiornamento dei singoli file in App a una versione .Net 4 di loro (così le piste app sotto .Net 4) Ho anche bisogno di cambiamento che file con estensione msi disinstallazione si trova sotto C: \ Windows \ Installer e quindi durante la disinstallazione di Windows Installer richiamerà .Net 4 per fare le azioni personalizzate, invece di .Net 3.5, che è stata la costruzione originale quando è stato installato l'applicazione.

Ecco uno script che automatizza il processo e nessuna necessità di utilizzare orche, basta passare il file msi per il cambiamento e le due necessaria DLL (che ho estratto dal msi della versione .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();

Il file dll InstallUtil può essere trovato sulla directory .Net in C: \ Windows per la versione 4.0, la seconda denominata MSVBDPCADLL è ancora un mistero per me, ma ho potuto estrarlo dalla MSI della generato .Net 4 (ci possono essere differenze per 32 e 64, probabilmente è necessario estrarre le diverse versioni delle DLL)

Altri suggerimenti

Ciao Per individuare una versione specifica del .NET framework per un eseguibile app.exe di nome, si può mettere quelle linee:

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

in un file denominato App.exe.config vicino al file eseguibile. Se il file esiste già, basta unire i due XMLs (EDIT: ho messo 'v4.0.30319' perché questa è la versione che ho sul mio computer, ma si dovrebbe mettere quello che ha, guarda% WINDIR% \ Microsoft. NET \ Framework o% windir% \ Microsoft.NET \ Framework64 per ottenerlo).

Forse non si conosce il nome del file eseguibile che disinstallare il software. In tal caso, si può tentare di processo in uso explorer per trovarlo (http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx).

Ma attenzione: facendo questo cambierà il bersaglio .NET FX di tutte le corse con lo stesso processo, da cui (forse) cambiare il comportamento di tutti disinstallazione fatto con questo programma di disinstallazione

Quale versione di Windows Installer stai usando? Non posso dirlo con certezza, ma mi chiedo se si utilizza una versione precedente del programma di installazione che vuole per utilizzare il framework 3.5.

Per controllare, osservare le proprietà per il progetto di installazione. Fai clic su "Prerequisiti", e scorrere fino alla parte inferiore della finestra. Controllare la versione che si desidera utilizzare per il processo di installazione.

Onestamente, non ho mai avuto / notato questo problema, ma mi chiedo se si utilizza il più recente di Windows Installer sarebbe risolvere il problema.

Ciao, COSÌ!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top