Frage

Mir Bezugnahme auf eine COM-Bibliothek in Visual Studio, so hat es erstellt automatisch die entsprechende Interop-Assembly für mich. Ich möchte einen GetType() auf diese COM-Objekte zu tun, aber sie immer wieder zurückkehren System.__ComObject. Abfragt sie für eine Schnittstelle funktioniert aber:

bool isOfType = someComeObject is ISomeComObject; //this works

Aber was ich wirklich will, ist dies die tatsächliche Art des COM-Objekts zurück:

Type type = someComeObject.GetType(); //returns System.__ComObject :-(

Wer weiß, wie zu tun, was ich tun will?

War es hilfreich?

Lösung

In Bezug auf Microsoft.VisualBasic.dll und dann:

Microsoft.VisualBasic.Information.TypeName(someCOMObject)

MSDN Referenz hier .

Andere Tipps

Die akzeptierte Antwort von Darin erfordert eine Abhängigkeit Microsoft.VisualBasic.dll. Wenn Sie nicht wollen, haben, dass Sie diese einfache Hilfsklasse verwenden können:

public static class TypeInformation
{
    public static string GetTypeName(object comObject)
    {
        var dispatch = comObject as IDispatch;

        if (dispatch == null)
        {
            return null;
        }

        var pTypeInfo = dispatch.GetTypeInfo(0, 1033);

        string pBstrName;
        string pBstrDocString;
        int pdwHelpContext;
        string pBstrHelpFile;
        pTypeInfo.GetDocumentation(
            -1, 
            out pBstrName, 
            out pBstrDocString, 
            out pdwHelpContext, 
            out pBstrHelpFile);

        string str = pBstrName;
        if (str[0] == 95)
        {
            // remove leading '_'
            str = str.Substring(1);
        }

        return str;
    }

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("00020400-0000-0000-C000-000000000046")]
    private interface IDispatch
    {
        int GetTypeInfoCount();

        [return: MarshalAs(UnmanagedType.Interface)]
        ITypeInfo GetTypeInfo(
            [In, MarshalAs(UnmanagedType.U4)] int iTInfo,
            [In, MarshalAs(UnmanagedType.U4)] int lcid);

        void GetIDsOfNames(
            [In] ref Guid riid,
            [In, MarshalAs(UnmanagedType.LPArray)] string[] rgszNames,
            [In, MarshalAs(UnmanagedType.U4)] int cNames,
            [In, MarshalAs(UnmanagedType.U4)] int lcid,
            [Out, MarshalAs(UnmanagedType.LPArray)] int[] rgDispId);
    }
}

Sie haben es im Grunde herausgefunden. GetType () auf einem COM-Objekt wird Ihr-System .__ ComObject geben, und man muss versuchen, es zu etwas zu werfen anderem zu sehen, was das Objekt wirklich ist.

stieß ich auf diese Frage vor ein paar Tagen, während ich für den vollständigen Typnamen eines System.__ComObject Objekt suchen. Ich landete den Typnamen bekommen Darins-Lösung und dann durch alle Klassen in allen Baugruppen Looping, das Spiel zu testen:

    typeName = Microsoft.VisualBasic.Information.TypeName(someCOMObject);
    foreach (System.Reflection.Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
    { 
        foreach (Type type in assembly.GetTypes())
        {
            if ((someCOMObject as type)!=null)
                fullTypeName = type.FullName;
        }
    }

Nicht die schnellste und eleganteste Lösung, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top