2010-02-27 24 views
34

Lorsque vous créez un nouveau projet C# dans Visual Studio, le fichier AssemblyInfo.cs généré inclut un attribut spécifiant un GUID d'assembly. Le commentaire au-dessus de l'attribut indique qu'il est utilisé "si ce projet est exposé à COM".AssemblyInfo.cs: Est-il utile de spécifier un Guid lors de l'utilisation de ComVisible (false)?

Aucun de mes assemblys ne contient de types qui doivent être visibles par COM, j'ai donc marqué mon assembly avec [assembly: ComVisible(false)]. Est-il utile de spécifier un GUID? Mon sentiment est que la réponse est "non" - alors pourquoi le fichier AssemblyInfo.cs par défaut contient-il [assembly: ComVisible(false)] et [assembly: Guid("...")]?

Edit:

Pour résumer les réponses:

Entre eux, les réponses expliquent que la spécification d'un GUID est nécessaire si et seulement si COM Interop est utilisé. Donc, dans ma situation, un GUID n'est pas nécessaire. Sharentooth explique en outre que [assembly: ComVisible(false)] n'implique pas de ne pas utiliser COM interop, puisqu'il est possible de surcharger ComVisible pour des types individuels. C'est pour cette raison que le fichier AssembyInfo.cs par défaut contient à la fois [assembly: ComVisible(false)] et un GUID.

Répondre

14

Ayant [assembly: ComVisible(false)] et [assembly: Guid("...")] en même temps prend tout son sens in certain cases. Vous commencez avec un assembly vide et voudrez peut-être en exposer quelque chose à COM. Donc, vous marquez l'assembly comme n'étant pas ComVisible et marquez plus tard les entités à exposer comme ComVisible. Il est certain que vous ne voulez pas exposer quoi que ce soit de votre assemblage à COM et que l'option "Register for COM interop" n'est pas cochée dans les paramètres du projet.

4

Non, pas de véritable raison de l'inclure. C'est vraiment inutile, sauf dans des scénarios COM Interop très spécifiques. Bien que je suppose qu'il pourrait y avoir quelque chose de utile d'avoir un GUID auquel vous pouvez accéder avec réflexion. Mais puisque ce n'est pas garanti d'être là, ce n'est pas comme si vous pouviez compter dessus.

+0

Il a une assez grande [utilisation] (http://stackoverflow.com/q/11403333/712526) pour un serveur Web autonome qui a besoin d'un certificat SSL – jpaugh

+0

@jpaugh: Pas sûr que nous parlons de la même chose. – Josh

+0

Je ne suis pas entièrement sûr, moi-même; mais, j'ai dû utiliser le GUID de l'information d'assemblage pour obtenir ce scénario de travail (voir le bas de ma réponse sur cette page.) Ma (provisoire) conclusion est que Windows utilise une interface COM pour faire une liaison SSL une application particulière. – jpaugh

9

Les GUID cohérents sont absolument essentiels dans COM. L'attribut [assembly: Guid] génère la bibliothèque de type LIBID. Sûrement le modèle de projet génère automatiquement un pour s'assurer que le programmeur n'oublie pas d'en fournir un quand il/elle retourne ComVisible à true.

Si un assembly [Guid] n'est pas fourni, Tlbexp.exe en synthétise un à partir du nom de l'assembly, de la version et de la clé publique. Ce n'est pas vraiment suffisant, les bibliothèques de types ont déjà une version. Changer [AssemblyVersion] générerait un LIBID différent. Particulièrement mauvais lorsque vous utilisez l'option auto-increment pour la version (comme 1.0. *), Vous pouvez rapidement remplir le registre avec une montagne de clés de registre TypeLib morts.

En bref, cela évite beaucoup de mésaventures.

+1

N'oubliez pas que vous pouvez définir ComVisible sur "false" au niveau de l'assemblage et le définir sur "true" pour les classes/interfaces/méthodes à l'intérieur de l'assembly et que ce dernier remplacera le précédent. Voir http://stackoverflow.com/questions/1649752/how-to-elegantly-prevent-a-webservice-proxy-from-being-exposition-to-com pour savoir comment il peut être utilisé. Il n'est donc pas nécessaire de l'activer au niveau de l'assemblage. – sharptooth

+1

Avoir un GUID cohérent n'a d'importance que si votre bibliothèque de types doit être exposée aux clients COM qui attendent une interface particulière. Vous pouvez toujours exposer des objets à COM via IDispatch sans un GUID permanent. – Josh

+0

Hmm, la liaison tardive nécessite un ProgID cohérent. Même problème. –