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?

Foi útil?

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

  1. 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
  2. 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
  3. 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.

  4. Compile seu projeto
  5. 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
  6. o botão direito do clique em Instalar, e clique em Adicionar ação personalizada
  7. Faça duplo clique na pasta de Aplicativos e, em seguida, em seu dll
  8. Faça o mesmo para o Commit acção
  9. 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.

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