2009-10-21 4 views
4

Scénario: J'ai un projet contenant deux projets C# qui, pour des raisons historiques, doivent communiquer entre eux en utilisant COM (via COM Interop). Le serveur COM est un objet d'automatisation en cours (appeler cela le « Serveur ») et le COM client est une application simple C# console qui charge le serveur comme ceci:Enregistrement d'assemblys x64 pour COM Interop

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

Visual Studio enregistre automatiquement les ensembles 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 (l'expérience du développeur ne m'intéresse ici, l'installation est un problème séparé) et tout fonctionne bien tant que les projets sont configurés pour générer Le code 32 bits ou le client COM est 32 bits. Le problème survient lors du développement sur un système 64 bits et les deux projets sont configurés pour générer du code pour 'Any CPU' qui les fait fonctionner 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 effectuent uniquement l'enregistrement 32 bits. Il place le ProgID dans la section de registre 64 bits, avec son CLSID de sous-clé, et le bon classID. Mais le truc CLSID {clsid} n'est pas là. C'est seulement dans la sous-arborescence WOW6432, pour 32 bits. Ainsi, l'activateur ne peut pas récupérer l'usine de classe parce qu'il ne peut pas trouver la chose.

Je serai vraiment impressionné par la communauté SO si je reçois une réponse à cette question, mais voilà:

Quelqu'un at-il d'autre terme ce problème en face? Comment l'avez-vous résolu? Quelle est la manière la plus simple de s'assurer que les assemblys COM Interop sont correctement enregistrés sur les machines de développement 64 bits?

+0

Tim, trouvez-vous peut-être cette solution sur votre propre? J'ai un problème similaire. –

Répondre

3

Nous avons rencontré ce problème et nous l'avons résolu en définissant des projets pour générer des assemblys pour x86. Ceci est sous-optimal, bien sûr, mais nous avons aussi plusieurs librairies 32 bits natives, donc nous avons dû le faire de toute façon.

+0

C'est une solution, mais j'avais espéré garder tout ce qui est natif 64 bits si possible. Avec les systèmes 64 bits devenant rapidement la norme, je préfère ne pas avoir à développer en 32 bits puis avoir de mauvaises surprises quand je m'installe finalement sur un système 64 bits. –

1

J'ai été capable de résoudre ce problème avec l'élément KB suivant. Fondamentalement, je désactivé pour l'enregistrement 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

+0

Merci Jeremy, c'est certainement une solution. Le problème est que nous sommes une équipe de développeurs travaillant sur un mélange de systèmes 32 bits et 64 bits. Le codage en dur d'un chemin vers le RegAsm 64 bits ne fonctionnera évidemment pas sur un système 32 bits. J'avais espéré utiliser "n'importe quel CPU" et juste avoir visual studio quoi faire. Alors maintenant, nous définissons nos versions de débogage à x86. Le serveur de build externe cible n'importe quel CPU pour la version finale et heureusement, il s'agit d'un serveur 32 bits, il n'y a donc pas de problème d'enregistrement. –

+0

L'utilisation de la variable d'environnement% windir% ne résout-elle pas cela? Sur le système 64 bits, ce sera le regasme 64 bits. Sur 32 bits, ce sera le regasme 32 bits, n'est-ce pas? - Peu importe, je viens de délimiter le "Framework64" dans le chemin ... –