Question

Scénario: J'ai un projet contenant deux projets C # qui, pour des raisons historiques, doivent communiquer entre eux via COM (via COM Interop). Le serveur COM est un objet d'automatisation en cours de processus (appelez-le "serveur") et le client COM est une simple application de console C # qui charge le serveur comme suit:

        var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
        var objLateBound = Activator.CreateInstance(objType);

Visual studio enregistre automatiquement les assemblages pour COM Interop si cette option est activée dans les paramètres du projet. C’est ce que j’utilise pour enregistrer le serveur (je ne suis intéressé que par l’expérience de développeur ici, l’installation est un problème distinct) et tout le reste. fonctionne correctement tant que les projets sont configurés pour générer du code 32 bits ou que le client COM est en 32 bits.

Le problème survient lors du développement sur un système 64 bits et que les deux projets sont configurés pour générer du code pour "Tout processeur", ce qui leur permet de s'exécuter en mode 64 bits. Cela génère l'erreur suivante:

"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."

Après quelques recherches, il semble que les scripts MSBuild n’effectuent que l’enregistrement 32 bits. Il place le ProgID dans la section de registre 64 bits, avec son sous-clé CLSID et le classID approprié. Mais la substance CLSID {clsid} n’est pas là. C'est seulement dans la sous-arborescence WOW6432, pour 32 bits. Donc, l'activateur ne peut pas récupérer la fabrique de classes car il ne peut pas trouver la chose.

Je serai vraiment impressionné par la communauté SO si j'obtiens une réponse à celle-ci, mais voici:

Quelqu'un d'autre a-t-il rencontré ce problème? Comment l'avez-vous résolu? Quel est le moyen le plus simple de s’assurer que les assemblages COM Interop sont correctement enregistrés sur des machines de développement 64 bits?

Était-ce utile?

La solution

Nous avons rencontré ce problème et l'avons résolu en configurant des projets pour générer des assemblys pour x86. Ceci est évidemment sous-optimal, mais nous avons également plusieurs bibliothèques natives 32 bits, nous avons donc dû le faire quand même.

Autres conseils

J'ai pu résoudre ce problème avec l'élément de base de connaissances suivant. En gros, j'ai désactivé l'enregistrement de COM Interop dans les paramètres de construction du projet et utilisé la commande post-construction:

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top