2010-09-13 18 views
60

Was ist der wahre Unterschied zwischen diesen beiden Optionen? Was ich weiß, ist:"Registrieren für COM Interop" vs "Make Assembly COM sichtbar"

Register für COM-Interop
Diese Option regasm auf der Baugruppe führt und registriert die Baugruppe als COM-Komponente (oder auch nicht) in der Registrierung mit allen COM wie Registry-Einträge. Erzeugt dieser Schritt eine TLB-Datei? Was wird noch getan?

Manchmal sehe ich eine Tlb generiert wird, wenn ich das Projekt kompilieren, aber manchmal nicht, warum ist das?

Fabrikat Montage COM sichtbar
Wie wirkt sich dieses auf einer Baugruppe hat? Wenn ich den folgenden Typ innerhalb dieser Assembly habe, muss ich noch die "Make Assembly COM Visible" angeben, obwohl mein Typ als ComVisible markiert ist?

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

Antwort

90

"assembly COM sichtbar machen" ist ein großer Hammer alle öffentliche Typen in der Assembly [ComVisible] zu machen. In seltenen Fällen möchten Sie die gewünschten Typen auswählen, die Sie sehen möchten, wie Sie es in Ihrem Snippet getan haben.

Nachdem die Assembly erstellt wurde, muss sie registriert werden, damit ein COM-Client sie wiederfinden kann. Da nur eine Nummer verwendet wird, um das Objekt zu identifizieren, das er erstellen möchte, die GUID, ist eine zusätzliche Suche erforderlich, um herauszufinden, welche DLL es implementiert. Das Registrieren umfasst das Schreiben von Schlüsseln in dem HKLM\Software\Classes\CLSID\{guid}-Teil der Registrierung. Sie können es selbst tun, indem Sie ausführen, oder Sie können es dem Build-System überlassen, es automatisch nach dem Aufbau der Baugruppe zu tun.

Was ist das, was "Registrieren für COM-Interop" tut. Es ist wünschenswert, da es sicherstellt, dass die alte Kopie der DLL automatisch unregistriert wird, bevor sie überschrieben wird, was eine Verschmutzung der Registrierung verhindert. VS muss aktiviert sein, um Schreibzugriff auf diese Registrierungsschlüssel zu haben, ein Grund dafür, dass es optional ist. Oder Sie wollen es einfach nicht registrieren, wie es auf Build-Servern üblich ist. Ich kann nicht sagen, warum Sie manchmal die .tlb ohne weitere Diagnose nicht bekommen.

+1

+1. Ich denke, ein weiterer Grund, warum es optional ist, ist, dass Sie die Assembly nicht immer auf Ihrem täglichen Build-Server registrieren müssen. Sie stellen beispielsweise eine C# -Assembly für COM bereit und verwenden sie in C++ über die Anweisung '# import', die gerne die TLB-Datei verwendet. – sharptooth

+0

+1: Ich denke durch "alle Typen in Assembly [ComVisible]" meinst du * alle öffentlichen Typen *, weil die öffentlichen Typen sind, was ich im exportierten TLB sehe. – A9S6

+0

Danke, Kommentare in der Antwort zusammengeführt. –