Tlbexp.exe(类型库导出程序)

更新:2011 年 4 月

类型库导出程序生成一个类型库,该类型库描述公共语言运行时程序集中定义的类型。

安装 Visual Studio 和 Windows SDK 时会自动安装此工具。 要运行工具,我们建议您使用 Visual Studio 命令提示符或 Windows SDK 命令提示符(也称 CMD Shell)。 您可以使用这些实用程序轻松运行工具,而不需要导航到安装文件夹。 有关更多信息,请参见 Visual Studio 和 Windows SDK 命令提示

  • 如果您的计算机上已安装了 Visual Studio:在任务栏上依次单击 Start、All Programs、Visual Studio、Visual Studio Tools、Visual Studio Command Prompt。

    - 或 -

    如果您的计算机上已安装了 Windows SDK:在任务栏上依次单击 Start、All Programs、Windows SDK 文件夹和 Command Prompt(或CMD Shell)。

  • 在命令提示处,键入下列命令:

tlbexp assemblyName [/out:file] [/nologo] [/silent] [/verbose]

参数

参数

说明

assemblyName

为其导出类型库的程序集。

选项

说明

/asmpath:目录

指定要在其中搜索程序集的位置。 如果使用此选项,则必须显式指定要在其中搜索所引用的程序集的位置(包括当前目录)。

当使用 asmpath 选项时,类型库导出程序不会在全局程序集缓存 (GAC) 中查找程序集。

/help

显示该工具的命令语法和选项。

/names:文件名

指定类型库中名称的大小写。 filename 参数是一个文本文件。 文件中的每一行都指定类型库中一个名称的大小写。

/nologo

取消显示 Microsoft 启动标题。

/oldnames

强制 Tlbexp.exe 导出修饰类型名(在存在类型名冲突的情况下)。 请注意,这是 .NET Framework 2.0 之前版本的默认行为。

/out:file(文件)

指定要生成的类型库文件的名称。 如果省略该选项,则 Tlbexp.exe 将生成一个与程序集的名称(实际的程序集名称,不一定与包含程序集的文件同名)且具有 .tlb 扩展名的类型库。

/silent

取消显示成功消息。

/tlbreference:typelibraryname

强制 Tlbexp.exe 在不参考注册表的情况下显式解析类型库引用。 例如,如果程序集 B 引用程序集 A,则可使用此选项来提供显式类型库引用而不依赖于注册表中指定的类型库。 Tlbexp.exe 将执行版本检查以确保类型库版本与程序集版本相匹配,否则将生成错误。

注意,在将 ComImportAttribute 特性应用于一个接口,然后该接口由另一类型实现的情况下,tlbreference 选项仍参考注册表。

/tlbrefpath:路径

所引用类型库的完全限定路径。

/win32

在 64 位计算机上编译时,此选项指定 Tlbexp.exe 生成一个 32 位类型库。

/win64

在 32 位计算机上编译时,此选项指定 Tlbexp.exe 生成一个 64 位类型库。

/verbose

指定详细模式;显示需要为其生成类型库的任何引用程序集的列表。

/?

显示该工具的命令语法和选项。

注意注意

Tlbexp.exe 的命令行选项不区分大小写,并可以按任何顺序提供。只需指定足够的选项来唯一标识它。例如,/n 等效于 /nologo/o:outfile.tlb 等效于 /out:outfile.tlb

备注

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 对象在非托管代码中没有意义。 在导出具有 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

请参见

参考

TypeLibExporterFlags

Regasm.exe(程序集注册工具)

Tlbimp.exe(类型库导入程序)

Visual Studio 和 Windows SDK 命令提示

其他资源

.NET Framework 工具

有关从程序集转换到类型库的摘要

修订记录

Date

修订记录

原因

2011 年 4 月

添加了有关使用 Visual Studio 和 Windows SDK 命令提示符的信息。

信息补充。