14

我必须在我的 .NET 应用程序中使用第三方非托管 COM dll。我需要修改此程序集以生成自定义 RCW。为了编辑互操作程序集,我需要特定程序集的类型库。谁能解释一下如何从非托管 COM dll 生成类型库?

regsvr32 中没有生成类型库的选项。

谢谢你,最好的问候,机器人。

4

5 回答 5

15

您需要OLE-COM 对象查看器,它是最新Windows SDK的一部分。然后您可以转到 File->View Type Lib 并将 IDL 保存到文本文件中。然后,您可以使用MIDL(也是 Windows SDK 的一部分)重新生成 TLB 和头文件。对于基本情况,应该这样做:

midl /out c:\temp /header MyHeader.h MyIDLFile.idl
于 2011-02-14T08:49:18.630 回答
6

如果您要做的只是从本机 dll 创建一个互操作程序集(并且本机 DLL 将 TLB 作为资源嵌入),您可以直接在 dll 上调用 tlbimp:

tlbimp Foo.dll /out:Interop.Foo.dll

这将生成 Interop.Foo.dll。然后可以使用 ildasm 修改 IL:

ildasm Interop.Foo.dll /out=Foo.il
于 2011-02-24T18:38:37.350 回答
5

如果你只有那个 COM DLL,你就不能生成类型库。类型库描述了实现的 COM 接口。但非托管 COM DLL 只需要公开DllGetClassObject. 这只会给你一个IClassFactory,如果你事先知道正确的类型,它可以让你创建新对象。

于 2011-02-14T08:51:32.967 回答
5

如果 typelib 嵌入在 DLL 资源中并且 TLB 文件本身是必需的,那么第 3 方软件可以提取它(尽管正如其他人指出的那样,这可能不是最理想的选择)。

例如使用资源黑客

  1. 打开 DLL 文件。
  2. 导航到树视图中的 TYPELIB\1\1033(或其他)节点。
  3. 从菜单中,选择操作 -> 将资源另存为二进制文件...
  4. 选择一个文件名并为其提供 .TLB 扩展名。

您现在可以引用该 .TLB 文件并在不需要原始 DLL 的情况下进行构建,例如

#import "test.tlb" named_guids
于 2014-04-22T16:02:01.923 回答
4

Visual Studio IDE 可以直接从非托管的 .exe 和 .dll 文件中提取二进制资源。如果类型库作为二进制资源保存在非托管COM DLL 中(例如,使用 VS 原生 C++ 编译器构建的),您可以按如下方式提取它:

  1. 在 VS资源编辑器(打开可执行文件时的默认编辑器)中打开 .dll 文件。
  2. 导航到资源树中的类型库资源 ( "TYPELIB", then )。1
  3. 右键单击类型库资源并选择export. 这会弹出一个“将文件另存为”对话框。
  4. 在“将文件另存为”框中,将文件名从默认(通常为bin1.bin)更改为类似的MyLibrary.tlb名称,然后单击“确定”。
  5. 通过打开导出的 .tlb 文件进行确认OleView.exe(结果应该与您通过打开 .dll 看到的结果相同OleView.exe)。

要从托管DLL(例如,使用 C# 构建的)中提取类型库,VS 包含该工具Tlbexp.exe(从 VS 命令提示符运行它): https ://msdn.microsoft.com/en-us/library/hfzzah2c(v =vs.110).aspx

于 2017-02-06T17:45:12.520 回答