Pergunta

Como posso consumir um objeto COM gratuito de registro sem copiar a DLL para o mesmo diretório que o executável? Isso é possível?

Eu gostaria de uma amostra completa de trabalho ou um guia passo a passo detalhado para o meu cenário exato.

Por exemplo, eu tenho os seguintes componentes:
Cpptestrunner.exe - Aplicativo de console VC ++
Cpptests.dll - VC ++ MFC DLL
Cscomserver.dll - C # COM DLL visível

Eu não quero modificar o exe ou seu diretório, como adicionar um manifesto externo.
Cpptests.dll está em um diretório diferente do que o EXE.
Tudo bem se o cscomserver.dll estiver no mesmo diretório que o CPPTESTS.DLL.

cpptestrunner.exe chama loadlibrary no cpptests.dll que funciona bem.

Após a incorporação manifesta-se e usando as APIs do Contexto de Ativação do Windows, fiquei capaz de copiar o diretório CSComserver.dll para o exe para verificar se cpptests.dll pode criar uma instância do cscomserver.dll sem problemas, mas novamente, estou tentando Evite esta etapa.

Atualmente, com o cscomserver.dll no mesmo diretório como cpptests.dll, e sem cscomserver.dll no diretório exe, estou recebendo o seguinte erro quando eu chamo de CEcoReateInstance:
Erro= 0x80070002 O sistema não pode encontrar o arquivo especificado.

Eu usei o monitor do processo Sysinternals para rastrear os caminhos cpptestrunner.exe olha, etc. Eu noto que, dependendo das coisas que eu tento fazer, às vezes cpptestrunner.exe tenta ler o cscomserver.dlll.config no mesmo diretório que o cpptests.dll, mas não importa o que eu tento colocar lá, eu não consegui obter além do erro.
Também dependendo de outras coisas eu tento fazer, cpptestrunner.exe tenta ler o cscomserver.dll no mesmo diretório como cpptests.dll mas por algum motivo, eu ainda recebo o mesmo erro.

Alguém sabe de código de trabalho com este cenário exato?

Como você provavelmente pode dizer, isso faz parte de alguns testes de integração de unidade.

Como uma solução simples, estou cospando atualmente o CPPTESTRUNNER.EXE para o mesmo diretório que o CPTESTS.dll e executando a partir daí, mas gostaria de evitar esta etapa.

Obrigado.

Foi útil?

Solução

O .NET procura o COM livre de registro gerenciado primeiro no GAC e, em seguida, na pasta do executável.Ele usa o contexto de ativação para ler os metadados de ativação, mas não para determinar a localização dos próprios arquivos.

Outras dicas

Você pode salvar a DLL em uma subpasta, digamos DLLFolder \ YourDll.dll e, no arquivo de manifesto de sua DLL, escrever o nome do arquivo como

<file name = "DLLFolder\YourDll.dll">

Mas você precisa manter o arquivo de manifesto (da DLL) no local onde o EXE foi salvo.

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