문제

Visual Studio에서 COM 라이브러리를 참조하고 있으므로 자동으로 해당 Interop 어셈블리를 만들었습니다. 나는하고 싶다 GetType() 이 COM 객체에서는 항상 돌아옵니다 System.__ComObject. 인터페이스를 위해 쿼리하는 것은 다음과 같습니다.

bool isOfType = someComeObject is ISomeComObject; //this works

그러나 내가 정말로 원하는 것은 COM 개체의 실제 유형을 반환하는 것입니다.

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

내가하고 싶은 일을하는 방법을 아는 사람이 있습니까?

도움이 되었습니까?

해결책

참조를 추가하십시오 Microsoft.VisualBasic.dll 그리고:

Microsoft.VisualBasic.Information.TypeName(someCOMObject)

MSDN 참조 여기.

다른 팁

Darin의 수락 된 답변은 의존성이 필요합니다 Microsoft.VisualBasic.dll. 원하지 않으면이 간단한 도우미 클래스를 사용할 수 있습니다.

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);
    }
}

당신은 기본적으로 그것을 알아 냈습니다. com 객체의 gettype ()는 당신에게 시스템을 줄 것입니다.

나는 며칠 전에이 질문을 우연히 발견했습니다. System.__ComObject 물체. Darin의 솔루션을 사용하여 유형 이름을 얻은 다음 모든 어셈블리의 모든 클래스를 통해 경기를 테스트했습니다.

    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;
        }
    }

가장 빠르고 가장 우아한 솔루션은 아니지만 효과가있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top