Pergunta

Depois de maneira muitas experiências, cheguei à conclusão de que o Windows Installer é simplesmente ruim tecnologia. Mas os clientes querem arquivos MSI.

Então, como posso criar um arquivo MSI que os extratos de um arquivo EXE para um diretório temporário e executá-lo com opções iguais ou semelhantes como foram passados ??para o arquivo EXE?

Opções para um MSI são explicados em opções Msiexec (de linha de comando ) (baixo nível "correr" de um MSI é msiexec Package.msi opção).

EDIT: de mjmarsh solução WiX parece que ele trabalha. Eu só não tive a chance de experimentá-lo ainda (tempo de crise). Se funciona, eu vou ser aceitá-lo.

EDIT: ele não funciona. peça que faltava:. assistiu / autônoma não parece estar disponível

De qualquer forma, a única para fazer este trabalho em tudo seria para a ação personalizada para matar seu processo pai!

EDIT: Então alguém postado como uma resposta ainda mais envolvendo a coisa toda como uma ação personalizada de pós-instalação. Teoricamente possível, mas desde que possam ser necessários uma reinicialização (graças MS para .NET 4 que requerem uma reinicialização às vezes) que temos que fazer ainda mais hackery. Então, a partir da matriz de vantagens:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.

Nenhum ponto.

Foi útil?

Solução 4

solução Não. Fomos NSIS como MSI corporativa instalar vai ser quebrado de qualquer maneira devido a MSI problema de nidificação (apenas Tente instalar EXE embrulho MSI de dentro MSI algum dia).

Outras dicas

Bem, não é o caminho livre ea maneira $$$. Eu não posso documento tudo aqui, mas isso deve começar.

Em uma nota lateral, sim, o Windows Installer é uma tecnologia de enlouquecer. Há muitas vezes onde eu acho que uma tarefa será simples, mas, na verdade, torna-se complicado. Você definitivamente tem que mergulhar para compreendê-lo.

Em qualquer caso, aqui vai:

Free: WiX ( aqui )

Esta é uma ferramenta livre para gerar arquivos MSI a partir de um conjunto de arquivos de configuração XML. Vou deixá-lo para encontrar tutoriais on-line, mas aqui está o ponto crucial:

Você pode compactar seu EXE para o instalador usando o seguinte tag no arquivo WXS:

<Binary Id="MYEXE" src="<path to my exe?"/>

Em seguida, você pode criar uma ação personalizada que lança seu arquivo EXE:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

Depois de inserir o seu ação personalizada no InstallExecuteSequence no local apropriado (I quase sempre executar mina em algum lugar entre InstallInitialize e InstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$: Get InstallShield ( AQUI )

Primeiro crie um projeto "MSI Básico" e certifique-se de dizer que você quer não setup.exe gerado . Você definir isso nas configurações de versão.

Em seguida, você, essencialmente, fazer a mesma coisa que com WiX, mas você tem uma interface de usuário para ele.

  • Você pode especificar o arquivo helper EXE usando o Editor direto e colocar seu arquivo EXE na tabela de 'binário'
  • Você pode criar uma ação personalizada para o lançamento desse arquivo EXE das "Ações personalizadas" Nó na árvore à esquerda
  • Você pode inserir a ação personalizada, selecionando "Instalar Seqüências" e colocá-lo no lugar InstallExecuteSequence entre InstallInitialize e InstallFinalize como eu disse antes.

Desculpe, eu não poderia ser mais detalhada, mas isso deve ser um bom começo.

Eu acho que a maneira mais fácil de criar um arquivo MSI é usar WiX .

Lição 1 do tutorial WiX é tudo que você precisa para criar uma instalação simples.

Joshua, eu entendo sua frustração muito bem. MSI é peculiar para dizer o mínimo - uma forma completamente nova de pensar em implantação. Ainda assim, aplicada corretamente MSI oferece a melhor implementação possível, especialmente para clientes corporativos.

Que operações o seu instalador EXE executar? É em grande parte de cópia de arquivos, alguns registro COM e algumas gravações de registro, ou ele executar lógica de instalação complexa, a criação de bases de dados etc ...? A razão que eu peço é porque provavelmente seria muito rápido para criar um bom funcionamento WIX MSI para você para que você possa abandonar a abordagem EXE.

Na verdade, é possível executar um EXE de dentro um MSI, mas requer sequência apropriada, e é garantido para causar-lhe mais azuis do que um simples MSI. Se o aplicativo é pequeno, e não fazer nada louco durante a instalação, eu ficaria feliz em lhe fornecer uma conversão básica WIX.

Há também um versão gratuita do Wrapper MSI . Ele também suporta desinstalação e atualizações. Além disso, ele só cria uma entrada nos programas de adicionar ou remover.

Adicionando a resposta weir's, altere o custom action attribute como abaixo:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

Configuração Return=asyncNoWai não esperar o exe para retorno. O instalador faz seu trabalho e fecha normalmente. Enquanto isso, o exe contínua a sua execução.

-Madhuresh

Se você não deseja gerenciar MSI, mas apenas executar EXE, tente Exe a MSI Converter Free . É só colocar no caminho para o EXE e obter uma MSI.

tente o seguinte:

pacote Em MSI, há uma chamada comportamento "Iniciar um aplicativo após a instalação", significa que o arquivo exe será executado após a instalação do MSI (MSI está fechado).

Tente executar o seu exe lá, então quando seu exe invocar outros pacotes MSI, não vai conflito com o primeiro.

Wix pode fazê-lo. Aqui está o meu código de exemplo para Wix 3.5:

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>

Eu estava tendo o mesmo problema (embrulhar EXE, chamar outro MSI do EXE incluindo a configuração .net, etc.), e aqui está a minha solução:

Eu construir o exe instalação usando InstallAware. Tem a sua própria MSI wrapper que envolve o EXE gerado com a MSI.

Ele funciona OK, o EXE pode chamar outro MSIs sem qualquer problema (incluindo a configuração .net, outras configurações 3rd party), mas isso é porque as extremidades MSI lançamento ( "retorno") direitos depois que ele lança o arquivo EXE configuração, e de que maneira eles evitam a limitação MSI de chamadas MSI recursiva.

MAS -. alguns clientes (empresas) que usa ferramentas de implantação MSI, requer a MSI (msiexec) para voltar (final), só após o término do processo de instalação, e isso é um problema com a solução acima

Assim - para resolver este:

Há uma outra MSI Wrapper (exemsi.com) que gera MSI que retorna somente após o término da instalação EXE, mas para o uso que você deve usar uma outra opção única de InstallAware:

InstallAware tem a opção para gerar a configuração EXE usando seu próprio motor nativa, e não com base no motor do Windows Installer, para evitar MSI limitação recursiva. Combine os dois e você tem a solução perfeita.

Espero que isso vai ajudar alguém, embora muitos anos passaram desde que esta pergunta foi publicado pela primeira vez.

truque simples:

Projeto imagem

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Setup
{
    internal class Program
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private static void Main(string[] args)
        {
            ShowWindow(GetConsoleWindow(), 0);
            Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi");
            string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi");
            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                st.CopyTo(fileStream);
            }
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
            p.WaitForExit();
            File.Delete(path);
        }
    }
}

Eu fiz uma ferramenta .NET livre para criar MSI de exe ou pasta simples e (ele está usando wixsharp e wix) http://legacy.averbouch.biz/free-msi-wrapper

Captura de tela

Nah homem, é só usar o assistente do Inno Setup. Faz um EXE configuração, mas não um MSI. É como 5 minutos e você terá um instalador de janelas.

de download Simplesmente -lo, instalá-lo, aponte-o para o seu EXE, e siga o instruções na tela

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