Registrar Assembléias x64 para interoperabilidade
-
05-07-2019 - |
Pergunta
Cenário: Eu tenho um projeto containgin dois projetos C #, que por razões históricas devem se comunicar uns com os outros usando COM (via COM Interop). O servidor COM é um objeto em processo de automação (chamo isso de "Servidor") eo cliente COM é uma simples aplicação C # consola que carrega o servidor como este:
var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
var objLateBound = Activator.CreateInstance(objType);
estúdio Visual registra automaticamente conjuntos para COM Interop se essa opção está habilitada nas configurações do projeto, de modo que o que eu uso para registrar o servidor (eu só estou interessado na experiência do desenvolvedor aqui, a instalação é uma questão separada) e tudo funciona bem, desde que os projetos são definidos para gerar o código de 32 bits ou o cliente cOM é de 32 bits.
O problema surge quando o desenvolvimento em um sistema de 64 bits e ambos os projetos são definidos para gerar código para 'Qualquer CPU', que resulta em-los em execução no modo de 64 bits. Isso resulta o seguinte erro:
"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."
Depois de algumas investigações, parece que os scripts MSBuild só executar o registro de 32 bits. Ele colocou o ProgID na secção de registo de 64 bits, juntamente com o seu CLSID subchave, eo classid adequada. Mas o CLSID {clsid} material não é lá. É apenas na subárvore WOW6432, para 32-bit. Assim, o ativador não pode recuperar a fábrica de classe porque ele não pode encontrar a coisa.
Eu vou ser realmente impressionado com a comunidade, então se eu conseguir uma resposta para esta pergunta, mas aqui vai:
Tem mais alguém executar frente este problema? Como você resolvê-lo? Qual é a maneira mais fácil de garantir que os conjuntos de interoperabilidade se registrado corretamente em máquinas de desenvolvimento de 64 bits?
Solução
Nós já encontrou este problema e resolveu-lo, definindo projectos para gerar conjuntos para x86. Este é abaixo do ideal, é claro, mas também temos vários libs 32 bits nativos, então tivemos que fazer isso de qualquer maneira.
Outras dicas
Eu era capaz de resolver isso com o seguinte item KB. Basicamente eu desligado registrar para interoperabilidade nas configurações de compilação do projeto, e usou o comando pós-compilação:
"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)"