Pergunta

Eu tenho um aplicativo que atualizei com alguns conjuntos .NET4, incluindo as ações personalizadas .dll que é executado quando o aplicativo será desinstalado. O aplicativo foi instalado inicialmente com o .NET 3.5 e requer algumas ações personalizadas ao instalar e desinstalar.

O problema é que agora, quando a desinstalação do .DLL das ações personalizadas mudou para sua versão .NET 4 e estou recebendo um sistema.badImageFormatexception: não foi possível carregar arquivo ou montagem 'x' ou uma de suas dependências. Esta montagem é criada por um tempo de execução mais recente que o tempo de execução atualmente carregado e não pode ser carregado. Nome do arquivo: 'x'

Alguém sabe uma maneira de dizer ao desinstalador para iniciar o processo com o .NET 4 em vez de ligar .NET 3.5 para carregar a DLL de ações personalizadas? Onde essas informações de desinstalação são armazenadas para cada produto? e como?

Foi útil?

Solução 3

Depois de uma longa pesquisa, encontrei uma maneira de resolver o problema. Fiz uma versão do aplicativo no .NET 4 e gerei o instalador. Instalou -o e comparou o arquivo .msi que o aplicativo salva na pasta C: Windows Installer com a versão anterior do mesmo arquivo, mas com .NET 3.5 (instalação original). Em seguida, abra os dois arquivos com o ORCAS e alterou alguns valores de propriedade e alguns arquivos binários no arquivo .NET 3.5 MSI do novo arquivo .NET 4 MSI.
Agora, quando faço uma atualização de arquivos únicos no aplicativo para uma versão .NET 4 deles (para que o aplicativo seja executado no .NET 4), também preciso alterar esse arquivo de desinstalação .msi localizado em C: Windows Installer e depois Ao desinstalar o instalador do Windows, invocará .NET 4 para executar as ações personalizadas em vez do .NET 3.5, que era a compilação original quando o aplicativo foi instalado.

Aqui está um script que automatiza o processo e não precisa usar orcas, basta passar no arquivo MSI para alterar e a DLL necessária (que eu extraí do MSI da versão .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();

O arquivo DLL do InstaltUtil pode ser encontrado no diretório .NET em C: Windows para a versão 4.0, o segundo chamado msvbdpcadll ainda é um mistério para mim, mas eu poderia extraí -lo do MSI do .NET 4 Gerado 4 (lá pode ser diferenças para 32 e 64 versões, provavelmente você precisará extrair as diferentes versões das DLLs)

Outras dicas

Olá, direcionar uma versão específica da estrutura .NET para um executável chamado App.exe, você pode colocar essas linhas:

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

para um arquivo chamado app.exe.config próximo ao executável. Se o arquivo já existir, basta mesclar os dois xmls (editar: eu coloquei 'v4.0.30319' porque esta é a versão que tenho no meu computador, mas você deve colocar o que você tem, observe %windir % Microsoft. Net Framework ou %windir % microsoft.net framework64 para obtê -lo).

Talvez você não saiba o nome do executável que desinstala seu software. Nesse caso, você pode tentar usar o Process Explorer para encontrá-lo (http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx).

Mas cuidado: fazer isso mudará o alvo .NET FX de todas as execuções com o mesmo processo, portanto (talvez) mude o comportamento de toda a desinstalação feita com este desinstalador!

Qual versão do Windows Installer você está usando? Não posso dizer com certeza, mas me pergunto se você está usando uma versão mais antiga do instalador que quer Para usar a estrutura 3.5.

Para verificar, observe as propriedades do projeto de configuração. Clique em "Pré -requisitos" e role até a parte inferior da caixa de diálogo. Verifique a versão que você deseja usar para o processo de instalação.

Honestamente, nunca tive/notei esse problema, mas me pergunto se o uso do instalador mais recente do Windows o corrigiria.

Hello, SO!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top