我正在使用 .NET ( ) 中的自动化 API来检查我自己生成System.Runtime.InteropServices.ComTypes
的类型库(见下文)。Bar.tlb
该类型库声明了一个接口,该接口IBar
继承自在IFoo
导入的类型库中定义的接口Foo.tlb
。检查ITypeInfo
表示IBar
会导致异常。(代码如下。)
在我开始编写代码之前,这里是我生成Bar.tlb
类型库的方式。
酒吧.idl:
[uuid(32E81FDD-BCB0-481B-AD3C-3ED04BFA7D1F)]
library Bar
{
importlib("Foo.tlb");
[uuid(CF062BE8-86D2-4D9B-8D1D-D889A77DA876)]
interface IBar : IFoo { };
}
Foo.idl:
[uuid(22E81FDD-BCB0-481B-AD3C-3ED04BFA7D1E)]
library Foo
{
importlib("stdole32.tlb");
[uuid(BF062BE8-86D2-4D9B-8D1D-D889A77DA875)]
interface IFoo : IUnknown { };
}
我使用以下命令编译了两个 IDL 文件,该命令成功,没有任何错误或警告:
midl.exe /mktyplib203 /env win32 /i … /tlb Foo.tlb Foo.idl
midl.exe /mktyplib203 /env win32 /i … /tlb Bar.tlb Bar.idl
现在我想做的是:
using System.Runtime.InteropServices;
using ITypeLib = System.Runtime.InteropServices.ComTypes.ITypeLib;
using ITypeInfo = System.Runtime.InteropServices.ComTypes.ITypeInfo;
static class Program
{
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
static extern ITypeLib LoadTypeLibEx(string path, REGKIND regkind);
enum REGKIND { REGKIND_NONE = 2 }
public static void Main()
{
ITypeLib typeLib = LoadTypeLibEx(@"C:\Path\To\Bar.tlb", REGKIND.REGKIND_NONE);
ITypeInfo typeInfo;
typeLib.GetTypeInfo(0, out typeInfo);
IntPtr typeAttrPtr;
typeInfo.GetTypeAttr(out typeAttrPtr); //! COMException: TYPE_E_CANTLOADLIBRARY
… // (HRESULT 0x80029c4a)
}
}
在标有 的行上抛出异常//!
。被检查ITypeInfo
的是IBar
接口。
我了解自动化 API 必须无法找到继承的接口IFoo
,该接口包含在另一个未注册的类型库中。
Bar.tlb
但显然无论如何都应该可以检查。OleView.exe
管理得很好:
(是的,它给出了一个关于无法重建外部类型库文件名的警告,这是因为我没有注册Foo.tlb
。这不是我担心的。)
如果OleView.exe
可以检查IBar
而不会崩溃,为什么我的代码会因为简单的事情而崩溃typeInfo.GetTypeAttr()
?我该如何解决?