2010-02-27 5 views
34

Wenn Sie in Visual Studio ein neues C# -Projekt erstellen, enthält die generierte Datei AssemblyInfo.cs ein Attribut, das eine Baugruppen-GUID angibt. Der Kommentar über dem Attribut gibt an, dass es verwendet wird, "wenn dieses Projekt COM ausgesetzt ist".AssemblyInfo.cs: Ist es sinnvoll, Guid bei der Verwendung von ComVisible (false) anzugeben?

Keine meiner Baugruppen enthalten Typen, die für COM sichtbar sein müssen, daher habe ich meine Baugruppe mit [assembly: ComVisible(false)] markiert. Ist es sinnvoll, eine GUID anzugeben?

Mein Gefühl ist, dass die Antwort "nein" ist - also warum enthält die Standard-Datei AssemblyInfo.cs sowohl [assembly: ComVisible(false)] als auch [assembly: Guid("...")]?

Edit:

antwortet Zusammengefasst:

Zwischen ihnen erklären die Antworten, die eine GUID Angabe ist erforderlich, wenn und nur wenn COM-Interop verwendet wird. Also, in meiner Situation ist eine GUID nicht notwendig.

sharptooth erklärt weiter, dass [assembly: ComVisible(false)] nicht bedeutet, nicht COM-Interop zu verwenden, da es möglich ist, ComVisible für einzelne Typen zu überschreiben. Aus diesem Grund enthält der Standard AssembyInfo.cs sowohl [assembly: ComVisible(false)] als auch eine GUID.

Antwort

14

Mit [assembly: ComVisible(false)] und [assembly: Guid("...")] zur gleichen Zeit macht den perfekten Sinn in certain cases. Sie beginnen mit einer leeren Assembly und wollen vielleicht COM etwas davon enthüllen. So markieren Sie die Baugruppe als nicht ComVisible und markieren Sie später die Elemente, die als ComVisible angezeigt werden sollen.

Sicher ist es Ihnen egal, wenn Sie wirklich nichts von Ihrer Assembly gegenüber COM verfügbar machen wollen und die Option "Registrieren für COM-Interop" in den Projekteinstellungen deaktiviert haben.

4

Nein, kein Grund, es einzuschließen. Es ist wirklich ziemlich unnötig, außer in sehr spezifischen COM-Interop-Szenarien. Obwohl ich annehme, könnte es etwas nützlich über eine GUID haben, die Sie mit Reflexion zugreifen können. Aber da es nicht garantiert ist, dort zu sein, ist es nicht so, wie du dich darauf verlassen könntest.

+0

Es hat eine ziemlich große [verwenden] (http://stackoverflow.com/q/11403333/712526) für einen eigenständigen Webserver, der ein SSL-Zertifikat benötigt – jpaugh

+0

@jpaugh: Nicht sicher, wir sprechen über die gleiche Sache. – Josh

+0

Ich bin mir nicht ganz sicher, ich selbst; Aber ich musste die GUID aus den Assembly-Informationen verwenden, um das Szenario zum Laufen zu bringen (siehe den unteren Teil meiner Antwort auf dieser Seite.) Meine (vorläufige) Schlussfolgerung ist, dass Windows eine COM-Schnittstelle verwendet, um eine SSL-Bindung zu "machen" eine bestimmte App. – jpaugh

9

Konsistente GUIDs sind in COM unbedingt erforderlich. Das Attribut [assembly: Guid] generiert die Typbibliothek LIBID. Sicherlich generiert die Projektvorlage automatisch eine, um sicherzustellen, dass der Programmierer nicht vergisst, eine zu liefern, wenn er ComVisible auf true dreht.

Wenn eine Assembly [Guid] nicht bereitgestellt wird, dann synthetisiert Tlbexp.exe eine aus dem Assemblynamen, der Version und dem öffentlichen Schlüssel. Das ist nicht wirklich gut genug, Typbibliotheken haben bereits eine Version. Wenn [AssemblyVersion] geändert wird, wird eine andere LIBID generiert. Besonders schlimm, wenn Sie die Auto-Inkrement-Option für die Version (wie 1.0. *) Verwenden, könnten Sie die Registrierung schnell mit einem Berg von toten TypeLib-Registrierungsschlüsseln füllen.

Lange Rede kurzer Sinn, es vermeidet viele unangenehme Pannen.

+1

Vergessen Sie nicht, dass Sie ComVisible auf Assembly-Ebene auf "false" setzen und für Klassen/Interfaces/Methoden in der Assembly auf "true" setzen können, wobei das letztere das vorherige überschreiben wird. Siehe http://stackoverflow.com/questions/1649752/how-to-elegantly-prevent-a-webservice-proxy-from-being-exposed-to-com für wie es verwendet werden kann. Es wird also nicht benötigt, es auf der Baugruppenebene "an" zu schalten. – sharptooth

+1

Eine konsistente GUID hat nur dann eine Bedeutung, wenn Ihre Typbibliothek COM-Clients ausgesetzt werden muss, die eine bestimmte Schnittstelle erwarten. Sie können Objekte weiterhin über IDispatch ohne eine permanente GUID der COM verfügbar machen. – Josh

+0

Hmm, späte Bindung erfordert eine konsistente ProgID. Gleiches Problem. –

Verwandte Themen