Warum gibt TypeName () bei der Arbeit mit COM andere Ergebnisse als .GetType und TypeOf zurück?

Ich denke, ich würde sehr davon profitieren, wenn ich die Unterschiede in der Funktionsweise dieser Funktionen verstehe, damit ich besser verstehen kann, wann die einzelnen Funktionen verwendet werden müssen.

Es fällt mir sehr schwer, mit zwei verschiedenen Interops (Excel und EPDM) zu arbeiten, die beide stark von schwachen typisierten Parametern Gebrauch gemacht haben. Ich habe immer wieder Probleme damit, zurückgegebene Objekte zu verwenden und sie in den richtigen Typ umzuwandeln (siehe Dokumentation). Nachdem ich eine Menge Zeit verschwendet habe, habe ich festgestellt, dass mitModellnam, GetType, und einTypeOf operator mit COM-Objekten kann zu unterschiedlichen Ergebnissen führen, und unter verschiedenen Umständen kann jedes Objekt mehr oder weniger zuverlässig sein als das nächste.

Nun, in den meisten FällenTypeName() scheint für die Typbestimmung mit COM-Objekten am zuverlässigsten zu sein. Die beiden anderen Funktionen gänzlich zu meiden, erscheint mir jedoch ziemlich frachttauglich, und außerdem bin ich heute auf ein @ gestoßeInteressantes Problem wo ich ein Objekt scheinbar nicht auf den Typ umwandeln kann, der von @ gemeldet wurTypeName(). In den Kommentaren zu diesem Problem wurde ein interessanter Gedanke angesprochen, dass Objekte, die @ implementiereIDispatch kann tatsächlich das @ zurückgebVersand Schnittstellentypname, der die Unterschiede teilweise erklären könnte.

Ich möchte wirklich besser verstehen, wie diese Funktionen tatsächlich funktionieren, aber ich verliere mich irgendwie durch das .NET ReferenceSource, also biete ich ein Kopfgeld für diese Frage an, in der Hoffnung, dass jemand erklären kann, wie diese verschiedenen Funktionen funktionieren und in welchem Kontext sie jeweils verwendet werden sollten.

Hier ist ein Code-Auszug aus der Arbeit mit der Excel-Interop.

Dim DocProps As Object 
DocProps = WeeklyReports.CustomDocumentProperties 'WeeklyReports is a Workbook object
Debug.Print(DocProps Is Nothing)
Debug.Print(TypeName(DocProps))
Debug.Print(TypeOf (DocProps) Is DocumentProperties)
Debug.Print(DocProps.GetType.ToString)

Die Ausgabe ist:

Falsc
Dokumenteigenschafte
Falsc
System .__ ComObject

Antworten auf die Frage(2)

Ihre Antwort auf die Frage