类型库导出程序(Tlbexp.exe)工具使用详解

来源:互联网  作者:本站整理
摘要:类型库导出程序工具(Tlbexp.exe)主要用于生成一个类型库,该类型库描述公共语言运行库程序集中定义的类型。…

备注说明

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 和更高版本支持类型库导出程序。

示例说明

下面的命令生成一个与 myTest.dll 中的程序集同名的类型库。
tlbexp myTest.dll

下面的命令生成一个名为 clipper.tlb 的类型库。
tlbexp myTest.dll /out:clipper.tlb

下面的示例阐释使用 Tlbexp.exe 从一个程序集导出类型库,该类型库引用使用 Tlbimp.exe 导入的程序集。
首先使用 Tlbimp.exe 导入类型库 myLib.tlb,并将其保存为 myLib.dll。
tlbimp myLib.tlb /out:myLib.dll

下面的命令使用 C# 编译器编译 Sample.dll,后者引用前面的示例中创建的 myLib.dll。
CSC Sample.cs /reference:myLib.dll /out:Sample.dll

下面的命令为引用 myLib.dll 的 Sample.dll 生成类型库。
tlbexp Sample.dll

【相关文章】好搜一下
Firefox中的XML DOM探讨

Firefox中的XML DOM探讨

现在我们来看看Firefox中的XMLDOM实现,Firefox的开发人员采用更…