Pregunta

Tengo una aplicación Me han actualizado con algunas asambleas .Net4, incluyendo las acciones personalizadas .dll que se ejecuta cuando la aplicación va a ser desinstalado. La aplicación se ha instalado inicialmente con .Net 3.5 y requiere algunas acciones personalizadas al instalar y desinstalar.

El problema es que ahora cuando se desinstala el archivo .dll de las acciones personalizadas han cambiado a su versión .Net 4 y yo estoy poniendo un System.BadImageFormatException: No se pudo cargar el archivo o ensamblado 'X' o uno de sus dependencias. Este conjunto está construido por una tiempo de ejecución más reciente que el tiempo de ejecución actualmente cargado y no se puede cargar. Archivo nombre: 'X'

¿Alguien sabe una manera de contar el desinstalador para iniciar el proceso con .Net 4 en lugar de llamar Net 3.5 para cargar las acciones personalizadas DLL? De dónde viene esta información de desinstalación se almacena para cada producto? y cómo?

¿Fue útil?

Solución 3

Después de una larga investigación, he encontrado una manera de resolver el problema. Hice una versión de la aplicación en .Net 4 y generó el instalador. Instalado y después se compara el archivo .msi de la aplicación guarda en la carpeta C: \ Windows \ Installer con la versión anterior del mismo archivo, pero con .Net 3.5 (instalación original). A continuación, abra ambos archivos con orcas y cambiado algunos valores de propiedad y un par de archivos binarios en el archivo msi Net 3.5 del nuevo archivo MSI .Net 4.
Ahora cuando hago una actualización de los archivos individuales en la aplicación a una versión .Net 4 de ellos (por lo que las carreras de aplicaciones bajo .Net 4) también necesito a cambio de que el archivo .msi desinstalación que se encuentra en C: \ Windows \ Installer y luego al desinstalar el instalador de Windows invocará .Net 4 para realizar las acciones personalizadas en lugar de Net 3.5 que fue la construcción original cuando se instaló la aplicación.

Aquí es un script que automatiza el proceso y no hay necesidad de orcas uso, sólo tiene que pasar el archivo MSI al cambio y los dos DLL necesaria (que extraje de la MSI de la versión .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();

El archivo DLL InstallUtil se puede encontrar en el directorio de .Net en C: \ Windows para la versión 4.0, el segundo llamado MSVBDPCADLL sigue siendo un misterio para mí, pero pude extraerlo del MSI del generada .Net 4 (no puede haber diferencias de 32 y 64, probablemente tendrá que extraer las diferentes versiones de los archivos DLL)

Otros consejos

Hola Para hacer referencia a una versión específica del marco .NET de un app.exe llamado ejecutable, puede poner estas líneas:

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

en un archivo denominado app.exe.config cerca del ejecutable. Si el archivo ya existe, simplemente fusionar los dos XMLs (EDIT: Pongo 'v4.0.30319', porque esta es la versión que tengo en mi equipo, pero usted debe poner el que usted tiene, mire en% windir% \ Microsoft. NET \ Framework o% windir% \ Microsoft.NET \ Framework64 para conseguirlo).

Tal vez usted no sabe el nombre del ejecutable que desinstalar el software. En ese caso, se puede tratar de explorador de proceso de uso para encontrarlo (http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx).

Pero cuidado: hacer esto va a cambiar el destino .NET FX de todas las carreras con el mismo proceso, por lo tanto, (tal vez) a cambiar el comportamiento de toda la desinstalación hecho con este programa de desinstalación

¿Qué versión de Windows Installer está usando? No puedo decir con certeza, pero me pregunto si está utilizando una versión anterior del programa de instalación que quiere para utilizar el marco 3.5.

Para comprobar, vistazo a las propiedades para el proyecto de instalación. Haga clic en "Requisitos previos", y desplazarse hasta la parte inferior del diálogo. Comprobar la versión que desea utilizar para el proceso de instalación.

Sinceramente, nunca he tenido / notado este problema, pero me pregunto si se utiliza la más reciente de Windows Installer lo arreglaría.

Hola, SO!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top