When you get a COM object in C#, if you know classes & what interfaces it implements, you can easily cast it to the desired type. But what about when you don't know it's type. Or more to the point, you think you know it's type and it doesn't implement that type. What to do.
The following method will return all Types that a COM object implements. I don't use this in production code but I do use it occasionally when writing code.
Download SystemUtils (the below code)
/// <summary>
/// Get all implemented types in a COM object. Code based on work at
/// http://fernandof.wordpress.com/2008/02/05/how-to-check-the-type-of-a-com-object-system__comobject-with-visual-c-net/
/// </summary>
/// <param name="comObject">The object we want all types of.</param>
/// <param name="assType">Any type in the COM assembly.</param>
/// <returns>All implemented classes/interfaces.</returns>
public static Type[] GetAllTypes(object comObject, Type assType)
{
// get the com object and fetch its IUnknown
IntPtr iunkwn = Marshal.GetIUnknownForObject(comObject);
// enum all the types defined in the interop assembly
Assembly interopAss = Assembly.GetAssembly(assType);
Type[] excelTypes = interopAss.GetTypes();
// find all types it implements
ArrayList implTypes = new ArrayList();
foreach (Type currType in excelTypes)
{
// com interop type must be an interface with valid iid
Guid iid = currType.GUID;
if (!currType.IsInterface || iid == Guid.Empty)
continue;
// query supportability of current interface on object
IntPtr ipointer;
Marshal.QueryInterface(iunkwn, ref iid, out ipointer);
if (ipointer != IntPtr.Zero)
implTypes.Add(currType);
}
// no implemented type found
return (Type[])implTypes.ToArray(typeof(Type));


Comments