Tlbexp.exe 生成一个类型库,该类型库包含程序集中定义的类型的定义。应用程序(如 Visual Basic 6.0)可以使用生成的类型库绑定到程序集中定义的 .NET 类型。
整个程序集立即被转换。不能使用 Tlbexp.exe 生成程序集中定义的类型子集的类型信息。
不能使用 Tlbexp.exe 从使用类型库导入程序 (Tlbimp.exe) 导入的程序集生成类型库。相反,应该引用由 Tlbimp.exe 导入的原始类型库。可以从一个程序集导出类型库,该类型库引用使用 Tlbimp.exe 导入的程序集。请参见下面的示例章节。
Tlbexp.exe 将生成的类型库放到当前工作目录中或为输出文件指定的目录中。一个程序集可能会导致生成若干个类型库。
Tlbexp.exe 生成类型库,但不注册它。这与程序集注册工具 (Regasm.exe) 不同,后者生成并注册类型库。若要使用 COM 生成和注册类型库,请使用 Regasm.exe。
如果未指定 /win32 或 /win64 选项,则 Tlbexp.exe 将生成一个 32 位或 64 位类型库,该类型库与执行编译所用的计算机的类型(32 位或 64 位计算机)相对应。为了交叉编译,可以在 32 位计算机上使用 /win64 选项来生成 64 位类型库,也可以在 64 位计算机上使用 /win32 选项来生成 32 位类型库。在 32 位类型库中,将 SYSKIND 值设置为 SYS_WIN32。在 64 位类型库中,将 SYSKIND 值设置为 SYS_WIN64。相应地转换所有数据类型转换(例如指针大小的数据类型,如 IntPtr 和 UIntPtr)。
如果使用 MarshalAsAttribute 属性指定 VT_UNKOWN 或 VT_DISPATCH 的 SafeArraySubType 值,则 Tlbexp.exe 将忽略随后使用的任何 SafeArrayUserDefinedSubType 字段。例如,对于以下签名:
[return:MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN, SafeArrayUserDefinedSubType=typeof(ConsoleKeyInfo))] public Array StructUnkSafe(){return null;}
[return:MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_DISPATCH, SafeArrayUserDefinedSubType=typeof(ConsoleKeyInfo))] public Array StructDispSafe(){return null;} 生成以下类型库:
[id(0x60020004)]
HRESULT StructUnkSafe([out, retval] SAFEARRAY(IUnknown*)* pRetVal);
[id(0x60020005)]
HRESULT StructDispSafe([out, retval] SAFEARRAY(IDispatch*)* pRetVal);
请注意,Tlbexp.exe 忽略了 SafeArrayUserDefinedSubType 字段。
由于类型库无法容纳在程序集中找到的所有信息,因此在导出过程中 Tlbexp.exe 可能会放弃一些数据。有关对转换过程的说明和发出到类型库中的每条信息的源的标识,请参见有关从程序集转换到类型库的摘要。
注意,类型库导出程序导出具有 VARIANT 类型的 TypedReference 参数的方法,尽管该 TypedReference 对象在非托管代码中没有意义。类型库导出程序 (Tlbexp.exe)在导出具有 TypedReference 参数的方法时,类型库导出程序不会生成警告或错误,使用结果类型库的非托管代码不会正确运行。
Microsoft Windows 2000 和更高版本支持类型库导出程序。