Como registrar um CCW .NET com regasm de um projeto de instalação do Visual Studio 2008
-
04-07-2019 - |
Pergunta
Eu tenho um projeto de instalação para um aplicativo de serviço .NET que utiliza um componente .NET wich expõe uma interface de COM (COM Callable Wrapper / CCW). Para obter o trabalho componente em uma máquina de destino, tem que ser registrado com
regasm.exe / tlb / codebase component.dll
A opção / tlb para gerar o typelib é obrigatória neste caso, caso contrário eu não posso criar objetos a partir desse conjunto.
A pergunta é: como posso configurar meu Visual Studio 2008 Setup-Project para registrar este assembly com uma chamada para regasm / tlb?
Solução
Você pode perder a chamada manual para regasm.exe usando System.Runtime.InteropServices.RegistrationServices vez:
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
{
throw new InstallException("Failed to register for COM Interop.");
}
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.UnregisterAssembly(GetType().Assembly))
{
throw new InstallException("Failed to unregister for COM Interop.");
}
}
Isso também cancela o registro a biblioteca em cima de desinstalação.
Outras dicas
- Em seu projeto principal (aquele que contém a classe que deseja registrar), clique o botão direito no arquivo de projeto e selecione Add / New Item e selecione Classe Installer. Chamá-lo de algo como clsRegisterDll.cs
- No designer que aparece, clique em 'Clique aqui para mudar para vista de código' ou clique direito no arquivo clsRegisterDll.cs em Solution Explorer e selecione View Code
-
Substituir o Install, Commit e métodos de desinstalação acrescentando:
// Obter a localização de regasm corda regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory () + @ "regasm.exe"; // Obter a localização do nosso DLL cadeia componentPath = typeof (RegisterAssembly) .Assembly.Location; // Executar regasm
System.Diagnostics.Process.Start (regasmPath, "/ codebase / tlb \" "+ componentPath + "\"");Trocar / codebase / tlb para / u na ação de desinstalação.
- Compile seu projeto
- Em seu instalador, certifique-se de ter adicionado o seu dll para a pasta de aplicativo e clique com o botão direito o projeto instalador e selecionar ações Ver / sob encomenda
- o botão direito do clique em Instalar, e clique em Adicionar ação personalizada
- Faça duplo clique na pasta de Aplicativos e, em seguida, em seu dll
- Faça o mesmo para o Commit acção
- construir e testar seu instalador
Um passo a passo com uma classe real para você experimentar pode ser encontrado em: http: // leon.mvps.org/DotNet/RegasmInstaller.html
Seu serviço deve ter uma classe Installer. Registre-se para o evento OnAfterInstall e chamar RegAsm:. O caminho deve ser calculado a partir do diretório do Windows e amarrado a uma versão específica .Net
Inicialmente, eu tentei executar regasm do processo de instalação (antes que eu vi desta postagem). Tentando executar regasm, e lidar com todos os erros era problemático - mesmo sem tentar lidar com privilégios elevados para o Windows 7
. Usando Runtime.InteropServices.RegistrationServices.RegisterAssembly
era muito mais limpo e forneceu um muito melhor interceptação de erro.
instalador Visual Studio torna única de registro da classe COM, mas não faz a geração tipo de biblioteca e de registro (isto é o interruptor /tlb
em regasm.exe does
) por padrão. Pelo menos no Visual Studio 2017 é suficiente para gerar a biblioteca de tipos nas etapas pós-compilação de DLL a ser registrados usando o utilitário Tlbexp.exe
.
Se o projeto instalador descobre um arquivo com extensão .tlb
no mesmo diretório e com o mesmo nome da biblioteca que está a instalar, inclui-lo automaticamente para o projeto de instalação e faz os passos de inscrição durante a instalação. Claro que também é possível gerar o arquivo .tlb
à mão e incluí-lo no projeto de instalação (e defina sua propriedade Registre-se para vsdrfCOM
).
Aqui está uma ótimo artigo sobre C # e cOM interface e as informações acima vêm de sua seção chamada de implantação.