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?

Foi útil?

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)" 

http://support.microsoft.com/kb/956933

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