2009-07-01 3 views

Antwort

9

Wenn der Compiler dies automatisch gehandhabt hat, haben Sie eine von zwei Situationen.

  • Eine neue GUID jedes Mal, wenn Sie kompiliert haben - da GUIDs veröffentlicht werden sollen, würde dies fehlschlagen.

  • Kollisionen - wenn die GUID jedes Mal gleich ist, basierend auf einem Hash des Namens, würden mehrere Projekte die gleiche GUID für verschiedene Zwecke verwenden.

  • Der bisherige Ansatz - eine explizite GUID gibt Entwicklern die Möglichkeit, diese nach Bedarf zu steuern.

    +1

    Also ist es eine "gesunde Gewohnheit", dieses Attribut immer manuell zu verwenden, oder es wird nur unter bestimmten Umständen benötigt? – Nissim

    +1

    Es wird viel besser sein, sie jedes Mal manuell zu verwenden - andernfalls müssen Sie alle Client-Ereignisse neu kompilieren, wenn sich nur die Schnittstellenimplementierung auf dem COM-Server geändert hat. – sharptooth

    +2

    Sie müssen nur in bestimmten Fällen ein GUID-Attribut hinzufügen - das primäre für COM-Interop, wenn Sie .NET verwenden, um ein COM-Objekt für die Verwendung durch ein anderes System zu schreiben. Je nachdem, welche Art von Projekt Sie haben, könnte dies eine alltägliche oder eine jährliche Veranstaltung sein. – Bevan

    1

    Manchmal möchten Sie bestimmten Klassen oder Modulen eine eindeutige Kennung geben, die in Ihrer Quelle konstant und fest codiert ist.

    2

    Sie können es tun (lassen Sie einfach das Attribut weg), aber dann wird der Compiler eine neue GUID für jede Neukompilierung erzeugen, auch wenn sich die Schnittstelle nicht geändert hat. Das ist bedauerlich, da die Benutzer dieser Schnittstelle die Änderung nicht kennen und die Schnittstelle von ihrer alten GUID abrufen und daher nicht abrufen können.

    8

    Diese Attribute sind sehr wichtig für COM. Was war der Vorgänger von .NET und hatte seine Blütezeit in den neunziger Jahren, bevor Java die Show stahl. .NET musste mit COM kompatibel sein, um eine Erfolgschance zu haben. Oder mit anderen Worten, Sie mussten in der Lage sein, einen COM-Server in einer .NET-Sprache zu schreiben, die ein großes Legacy-Programm verwenden könnte.

    Das [ComVisible] -Attribut stellt sicher, dass ein COM-Client-Programm die IEnumerable-Schnittstelle sehen und verwenden kann. Wichtig, damit das Clientprogramm .NET-Auflistungen auflisten kann.

    Das Attribut [Guid] ist in COM entscheidend, es identifiziert eine Schnittstelle. Dies wird durch eine GUID, nicht einen Namen, sichergestellt, um sicherzustellen, dass sie für mehrere Anwendungen, die von verschiedenen Programmierern geschrieben wurden, eindeutig ist. .NET hat dies auch, verwendet jedoch einen Namen, um es für Menschen einfacher zu machen. "System.Collections.IEnumerable, mscorlib, Version = 2.0.0.0, Kultur = neutral, PublicKeyToken = b77a5c561934e089".

    IEnumerable <>, die generische Version, hat keine [Guid]. Generics sind nicht kompatibel mit COM. Es ist heutzutage nicht mehr so ​​wichtig, nicht mehr viel sichtbares COM zu sehen, das meiste davon wurde von freundlichen .NET Klassen umschlossen. Aber immer noch sehr wichtig in Windows, vor allem in der brandneuen WinRT (alias Metro). Sie verwenden das auch nicht direkt und machen COM etwas wie die Assemblersprache der Windows-Programmierung.

    0

    Um diese Definition zu lesen, müssen Sie die Bedeutung jedes dieser Attribute nachschlagen. Die erste, ComVisibleAttribute wird wie folgt beschrieben:

    Kontrollen Zugänglichkeit eines einzelnen verwalteten Typ oder ein Mitglied oder aller Art innerhalb einer Baugruppe zu COM.

    , die uns sagt, dass ComVisible etwas mit COM zu tun, und lässt uns angeben, ob eine bestimmte Art zu COM-Programme sichtbar ist. Weiter unten auf der Seite befindet sich ein Link zu weiteren Details darüber, wofür das Attribut steht und wie es vom Typbibliotheksexporteur verwendet wird.

    Die zweite, GuidAttribute, ist ein bisschen weniger hilfreich zuerst:

    liefert eine explizite System.Guid, wenn eine automatische GUID unerwünscht ist

    aber auch hier haben Sie den Rest lesen von dem Weg nach unten, und Sie werden eine andere Erwähnung des Typenbibliotheksexporteurs sehen.

    Wenn man diese beiden zusammensetzt, wird klar, dass diese beiden Attribute steuern, wie IEnumerator verarbeitet wird, wenn sie in eine Typbibliothek exportiert werden. Wenn Sie nicht wissen, was eine Typbibliothek ist, wird Ihnen das wahrscheinlich nicht viel bedeuten. Wenn Sie kein COM-Interop verwenden, können diese Attribute gefahrlos ignoriert werden. Wenn Sie sind mit COM-Interop, müssen Sie die Guid kennen, um die Schnittstelle von nicht verwalteten COM-Code ordnungsgemäß zugreifen.

    Microsoft stellt diese auf jede Schnittstellendefinition für den Fall, dass Sie sie benötigen; Ein Teil der Fähigkeiten beim Lesen der MSDN-Seiten besteht darin, diese Art von Informationen zu erkennen und zu wissen, wann sie für Sie nicht nützlich sind. Jetzt, wo Sie wissen, wofür diese zwei Attribute sind, sollten Sie in der Lage sein, herauszufinden, ob sie für Sie relevant sind, und sie ansonsten ignorieren.