COM 객체의 유형을 얻는 방법
-
07-07-2019 - |
문제
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;
}
}
가장 빠르고 가장 우아한 솔루션은 아니지만 효과가있었습니다.
제휴하지 않습니다 StackOverflow