2015-06-02 11 views
5

Warum ist System.IO.Path COM sichtbar, wenn es nur statische Elemente und Felder enthält?Warum ist System.IO.Path (eine Klasse mit nur statischen Membern) COM sichtbar?

[ComVisibleAttribute(true)] 
public static class Path 

Ich hatte den Eindruck, dass man nicht statische Elementfunktionen eines COM-Objekts aufrufen können (und zusätzlich, dass die Klasse einen Standardkonstruktor benötigen würde, die Path nicht hat).

Beachten Sie auch, SO Benutzer sharptooth Kommentar:

Es ist auch erwähnenswert, dass es nicht Guid Attribut hat die höchstwahrscheinlich bedeutet, dass die Klasse-ID jedes Mal regeneriert wird es kompiliert wird.

Warum ist PATH COM sichtbar und was könnte damit gemacht werden?

+0

Beachten Sie auch, dass es nicht "Guid" -Attribut hat, was wahrscheinlich bedeutet, dass die Klassen-ID jedes Mal neu kompiliert wird, wenn sie kompiliert wird. – sharptooth

Antwort

5

Sicher, das ist ein Fehler. Es ist in guter Gesellschaft, viele andere Klassen von mscorlib haben das gleiche Problem. Zum Beispiel: Registrierung, Verzeichnis, Datei, Puffer, Umgebung, Nullable, Monitor, Timeout. Aber nicht konsequent wurde das Attribut für BitConverter, Console, Convert, GC, Math und so weiter weggelassen.

Das Attribut ist ansonsten für viele Klassen in mscorlib wichtig, benutzerdefinierte CLR-Hosts und Skriptsprachen hängen davon ab. Sieht so aus, als ob die Microsoft-Programmierer, die das Attribut anwendeten, nur mit Autopilot arbeiteten. Der Fehler ist belanglos, Tlbexp weiß, wie man damit umgeht. Die Co-Klasse erhält das Attribut [noncreatable], so dass Client-Programme keine Instanz der Klasse erstellen können. Und die automatisch generierten Schnittstellen sind leer. Der Typ ist also überhaupt nicht nutzbar und kann auch nicht versehentlich verwendet werden.

Wenn Sie eigentlich wollen System.IO.Path von einem COM-Client-Programm verwenden, dann müssen Sie eine [ComVisible] Wrapperklasse dafür schreiben. Natürlich kann jede Methode, die Sie schreiben, direkt an die eine der Path-Methoden delegieren. Sie möchten das [appobject] -Attribut in der Co-Klasse, so dass es sich statisch in einem Client-Programm verhält, das das Attribut unterstützt, leider hat .NET kein Attribut dafür.

Verwandte Themen