public static string TypeKind2String(TypeLibTypes.Interop.TYPEKIND typeKind) { string typeKindString = null; switch (typeKind) { case TypeLibTypes.Interop.TYPEKIND.TKIND_ALIAS: typeKindString = "Alias"; break; case TypeLibTypes.Interop.TYPEKIND.TKIND_COCLASS: typeKindString = "CoClass"; break; case TypeLibTypes.Interop.TYPEKIND.TKIND_DISPATCH: typeKindString = "DispatchInterface"; break; case TypeLibTypes.Interop.TYPEKIND.TKIND_ENUM: typeKindString = "Enum"; break; case TypeLibTypes.Interop.TYPEKIND.TKIND_INTERFACE: typeKindString = "Interface"; break; case TypeLibTypes.Interop.TYPEKIND.TKIND_MODULE: typeKindString = "Module"; break; case TypeLibTypes.Interop.TYPEKIND.TKIND_RECORD: typeKindString = "Struct"; break; case TypeLibTypes.Interop.TYPEKIND.TKIND_UNION: typeKindString = "Union"; break; } return typeKindString; }
private static extern int LoadTypeLibWithResolver([MarshalAs(UnmanagedType.LPWStr)] string file, REGKIND kind, ITypeLibResolver resolver, out TypeLibTypes.Interop.ITypeLib typeLib);
public int ResolveTypeLib(string simpleName, Guid tlbId, int lcid, ushort majorVersion, ushort minorVersion, TypeLibTypes.Interop.SYSKIND syskind, out string bstrPathName) { // Remember the type lib info s_MissingTypeLibInfo = new TypeLibInfo(); s_MissingTypeLibInfo.name = simpleName; s_MissingTypeLibInfo.guid = tlbId; s_MissingTypeLibInfo.majorVersion = majorVersion; s_MissingTypeLibInfo.minorVersion = minorVersion; // // Find this type library in list of referenced type libraries // foreach (string pathName in s_RefTypeLibraries.Keys) { TypeLib refTypeLib = new TypeLib(s_RefTypeLibraries[pathName] as TypeLibTypes.Interop.ITypeLib); TypeLibAttr libAttr = refTypeLib.GetLibAttr(); if (libAttr.guid == tlbId) { if (libAttr.wMajorVerNum == majorVersion && libAttr.wMinorVerNum == minorVersion) { // Resolved to a matching type lib bstrPathName = pathName; return 0; } } } // // Find using GUID // int hr = TypeLib.QueryPathOfRegTypeLib(ref tlbId, majorVersion, minorVersion, lcid, out bstrPathName); if (hr >= 0) { // Try loading the type library and verify guid/version hr = TryLoadTypeLib(bstrPathName, simpleName, tlbId, majorVersion, minorVersion); if (hr >= 0) return hr; } // // Try to load current directory // bstrPathName = Path.Combine(Directory.GetCurrentDirectory(), simpleName); if (File.Exists(bstrPathName)) { // Try loading the type library guid/version hr = TryLoadTypeLib(bstrPathName, simpleName, tlbId, majorVersion, minorVersion); if (hr >= 0) return hr; } if (TlbImpCode.s_Options.m_bVerboseMode) { Output.WriteInfo( Resource.FormatString("Msg_TypeLibRefResolveFailed", new object[] { simpleName, majorVersion.ToString() + "." + minorVersion, tlbId.ToString() }), MessageCode.Msg_TypeLibRefResolveFailed); } return -1; }
/// <summary> /// Converts COM type library type to internal type mapping /// </summary> public static ConvType TypeKindToConvType(TypeLibTypes.Interop.TYPEKIND typekind) { switch (typekind) { case TypeLibTypes.Interop.TYPEKIND.TKIND_DISPATCH: return ConvType.Interface; case TypeLibTypes.Interop.TYPEKIND.TKIND_ENUM: return ConvType.Enum; case TypeLibTypes.Interop.TYPEKIND.TKIND_INTERFACE: return ConvType.Interface; case TypeLibTypes.Interop.TYPEKIND.TKIND_RECORD: return ConvType.Struct; case TypeLibTypes.Interop.TYPEKIND.TKIND_UNION: return ConvType.Union; case TypeLibTypes.Interop.TYPEKIND.TKIND_COCLASS: return ConvType.CoClass; default: Debug.Assert(false, "Should not get here!"); return ConvType.Interface; } }