Como fazer um MSI que simplesmente envolve um arquivo EXE
-
21-08-2019 - |
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.
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
entreInstallInitialize
eInstallFinalize
como eu disse antes.
Desculpe, eu não poderia ser mais detalhada, mas isso deve ser um bom começo.
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:
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
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