我必须在我的 .NET 应用程序中使用第三方非托管 COM dll。我需要修改此程序集以生成自定义 RCW。为了编辑互操作程序集,我需要特定程序集的类型库。谁能解释一下如何从非托管 COM dll 生成类型库?
regsvr32 中没有生成类型库的选项。
谢谢你,最好的问候,机器人。
您需要OLE-COM 对象查看器,它是最新Windows SDK的一部分。然后您可以转到 File->View Type Lib 并将 IDL 保存到文本文件中。然后,您可以使用MIDL(也是 Windows SDK 的一部分)重新生成 TLB 和头文件。对于基本情况,应该这样做:
midl /out c:\temp /header MyHeader.h MyIDLFile.idl
如果您要做的只是从本机 dll 创建一个互操作程序集(并且本机 DLL 将 TLB 作为资源嵌入),您可以直接在 dll 上调用 tlbimp:
tlbimp Foo.dll /out:Interop.Foo.dll
这将生成 Interop.Foo.dll。然后可以使用 ildasm 修改 IL:
ildasm Interop.Foo.dll /out=Foo.il
如果你只有那个 COM DLL,你就不能生成类型库。类型库描述了实现的 COM 接口。但非托管 COM DLL 只需要公开DllGetClassObject
. 这只会给你一个IClassFactory
,如果你事先知道正确的类型,它可以让你创建新对象。
如果 typelib 嵌入在 DLL 资源中并且 TLB 文件本身是必需的,那么第 3 方软件可以提取它(尽管正如其他人指出的那样,这可能不是最理想的选择)。
例如使用资源黑客:
您现在可以引用该 .TLB 文件并在不需要原始 DLL 的情况下进行构建,例如
#import "test.tlb" named_guids
Visual Studio IDE 可以直接从非托管的 .exe 和 .dll 文件中提取二进制资源。如果类型库作为二进制资源保存在非托管COM DLL 中(例如,使用 VS 原生 C++ 编译器构建的),您可以按如下方式提取它:
"TYPELIB"
, then )。1
export
. 这会弹出一个“将文件另存为”对话框。bin1.bin
)更改为类似的MyLibrary.tlb
名称,然后单击“确定”。OleView.exe
(结果应该与您通过打开 .dll 看到的结果相同OleView.exe
)。要从托管DLL(例如,使用 C# 构建的)中提取类型库,VS 包含该工具Tlbexp.exe
(从 VS 命令提示符运行它):
https ://msdn.microsoft.com/en-us/library/hfzzah2c(v =vs.110).aspx