如何从非托管COM DLL生成类型库

Rob*_*lex 14 c++ com regsvr32 unmanaged typelib

我必须在我的.NET应用程序中使用第三方非托管COM dll.我需要修改此程序集以生成自定义RCW.为了编辑Interop程序集,我需要特定程序集的类型库.可以任何人解释我如何从非托管COM DLL生成类型库?

regsvr32中没有选项来生成类型库.

谢谢你,最诚挚的问候,Robo.

Gui*_*ici 14

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

midl /out c:\temp /header MyHeader.h MyIDLFile.idl
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

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

ildasm Interop.Foo.dll /out=Foo.il
Run Code Online (Sandbox Code Playgroud)


MSa*_*ers 5

如果只有COM DLL,则无法生成类型库.类型库描述了实现的COM接口.但是一个非托管的COM DLL只需要公开DllGetClassObject.这只能让你获得一个IClassFactory,如果你预先知道正确的类型,它可以让你创建新的对象.


war*_*ies 5

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

例如,使用Resource Hacker:

  1. 打开DLL文件.
  2. 导航到树视图中的TYPELIB\1\1033(或其他)节点.
  3. 从菜单中选择Action - > Save Resource as binary file ...
  4. 选择文件名并为其提供.TLB扩展名.

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

#import "test.tlb" named_guids
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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