2010-09-13 5 views
60

Quelle est la réelle différence entre ces deux options? Ce que je sais est:"S'inscrire à COM Interop" vs "Rendre l'ensemble COM visible"

Inscrivez-vous pour COM Interop
Cette option exécute regasm sur l'assemblage et enregistre l'assemblage en tant que composant COM (ou peut-être pas) dans le registre avec toutes les COM comme les entrées de registre. Cette étape génère-t-elle un fichier TLB? Quoi d'autre est fait?

Parfois, je vois une tlb est générée lorsque je compile le projet mais parfois non, pourquoi est-ce?

Marque assembly COM visible
Quel effet celui-ci a sur un ensemble? Si j'ai le type suivant à l'intérieur de cet assembly, ai-je encore besoin de spécifier "Make assembly COM Visible" même si mon type est marqué comme ComVisible?

[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)] 
public interface IMyInterface 
{ 
} 

Répondre

90

"Faites assembly COM visible" est un gros marteau pour faire tous les types publics dans l'assemblée [ComVisible]. Rarement souhaitable, vous voudrez sélectionner les types spécifiques que vous voulez voir, comme vous l'avez fait dans votre extrait de code. Une fois l'assemblage créé, il doit être enregistré pour qu'un client COM puisse le retrouver. Le seul qui utilise un nombre pour identifier l'objet qu'il veut créer, le GUID, une recherche supplémentaire est nécessaire pour savoir quelle DLL l'implémente. L'enregistrement implique l'écriture de clés dans la partiedu registre. Vous pouvez le faire vous-même en exécutant Regasm.exe /codebase /tlb ou vous pouvez laisser le système de construction le faire automatiquement après la construction de l'assemblage.

C'est ce que fait "Register for COM interop". Il est souhaitable car il garantit que l'ancienne copie de la DLL est automatiquement désenregistrée avant d'être écrasée, ce qui empêche la pollution du registre. VS doit être élevé pour avoir un accès en écriture à ces clés de registre, une raison pour le rendre facultatif. Ou vous ne voulez pas l'enregistrer, commun sur les serveurs de build. Je ne peux pas commenter pourquoi vous obtiendrez parfois le .tlb sans plus de diagnostics.

+1

+1. Je suppose qu'une autre raison pour laquelle c'est facultatif est que vous n'avez pas toujours besoin d'enregistrer l'assembly sur votre serveur de build quotidien. Par exemple, vous exposez un assembly C# à COM et vous le consommez à partir de C++ via la directive '# import 'qui est heureuse d'utiliser le fichier .tlb. – sharptooth

+0

+1: Je pense que par "tous les types dans l'assemblage [ComVisible]" vous voulez dire * tous les types publics * parce que les types publics sont ce que je vois dans le TLB exporté. – A9S6

+0

Merci, les commentaires ont fusionné dans la réponse. –