Registrando um servidor com wix
-
03-07-2019 - |
Pergunta
Eu tenho tentado determinar uma solução de melhor estojo para registrar um servidor COM usando o WIX para criar um pacote de instalador do Windows e estou lutando.
Neste post Arquivo de Engenharia de Implantação: Howto: Use Regsvr32.exe com Wix, existe uma solicitação aberta para que a "polícia de configuração" reprimisse o uso do RegSVR32 através de uma ação personalizada exe. Eu conheço os males de usar regsvr32
como se registra no sistema e não ao usuário, mas também me lembro que OleSelfRegister
pode ter problemas de um boletim de suporte da Microsoft (desculpe, não consigo encontrar o link) - e acredito que eles recomendaram o uso regsvr32
.
Algum conselho?
Solução
Leia "Não use as tabelas de auto -rreg e typelib" em:
https://msdn.microsoft.com/en-us/library/bb204770#no_selfreg
Para Wix, dê uma olhada no Componente Elemento na referência do esquema em:
http://wixtoolset.org/documentation/manual/v3/xsd/wix/component.html
Notar de certos elementos filhos, como Appid, Classe, Progid, Registro e assim por diante. A técnica adequada é usar COM extraction
Para refletir as informações de registro e emitê -las declarativamente ao seu instalador para que o MSI possa cuidar dele sem sair do processo para algum código (como DllRegisterServer()
) Isso pode falhar e também não fornece informações do MSI sobre a pegada do componente da perspectiva de reparo e anúncio.
Outras dicas
Há uma ferramenta "sebo" incluída no Wix. Você pode usá -lo para gerar entradas de registro corretas automaticamente. Em seguida, basta configurar sua instalação do WIX para escrever essas entradas. A auto -rreg não deve ser usada.
Como o @Trampster apontou, o Heat.exe não faz um bom trabalho na colheita de entradas do registro de servidores COM. Eu tentei, mas os resultados estavam incompletos.
Em vez disso, seguindo o conselho em Monitore os acessos do registro (Ferramentas de instalação: monitoramento), Usei o installshield regspyui. Isso supostamente envia versões do InstallShield V7 e além, incluindo a versão de avaliação. Esta informação pode estar desatualizada; Eu posso confirmar que é não Fornecido com o Prettyless InstallShield LE inútil que vem com o VS2013.
Felizmente, eu tinha uma cópia do InstallShield 2010 e isso veio com o Regspyui.
De qualquer forma, o Regspyui foi fácil de usar: aponte para o com .exe, extraia as informações do registro para um arquivo .reg. Em seguida, use o calor para colhê -lo em um arquivo .wxs que você pode adicionar ao seu projeto WIX
heat reg <some.reg> -gg -o <some.wxs>
Então é apenas uma questão de modificar os caminhos codificados que apontam para a localização do COM .exe, para que eles reflitam a pasta de instalação pretendida.
por exemplo, se o arquivo .wxs criado por regspyui+calor tem algo assim
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Component Id="blah" Guid="{xxxxxxxxxxxxxxxxxxxxxxxxx}" KeyPath="yes">
<RegistryKey Key="TypeLib\{xxxxxxxxxxxxxxxxxxxxxx}\4.1\0\win32" Root="HKCR">
<RegistryValue Value="C:\Users\you\projects\MyProject\dependencies\installation\COMFOO.exe" Type="string" />
</RegistryKey>
</Component>
</DirectoryRef>
</Fragment>
e você está instalando em seu arquivo wix principal para
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="COMPANY" Name="My Company">
<!--This is the actual installation folder-->
<Directory Name="MyProduct" Id="MYPRODUCT">
Em seguida, basta editar o caminho do RegistryValue@Value para ... "[MYPRODUCT]\COMFOO.exe
"
Há apenas uma desvantagem nisso: o registro Wix com o Heat.exe não funciona para os servidores .exe com. O InstallShield e suas ferramentas parecem apoiá -lo, mas o Regspyui é apenas uma ferramenta de interface do usuário, não uma que eu posso executar na minha máquina de construção.
Experimente isso:
- Crie um novo projeto .NET
- Adicione uma referência de projeto à candidata com dll ou oop exe cujos WXs você deseja reunir
- Procure o arquivo
Interop.candidate.dll
(noobj\debug
pasta) - Execute a ferramenta Wix Heat na DLL de interoper que você acabou de encontrar.