我必须在我的.NET应用程序中使用第三方非托管COM dll。我需要修改此程序集以生成custom RCW。为了Edit Interop Assembly,我需要特定程序集的类型库。任何人都可以向我解释如何从非托管COM dll生成类型库?
regsvr32中没有选项来生成类型库。
谢谢你, 最好的祝福, 机器人。
答案 0 :(得分:14)
您需要OLE-COM Object Viewer,这是最新Windows SDK内容的一部分。然后,您可以转到File-> View Type Lib并将IDL保存到文本文件中。然后,您可以使用MIDL(也是Windows SDK的一部分)重新生成TLB和头文件。这样的事情应该适用于基本情况:
midl /out c:\temp /header MyHeader.h MyIDLFile.idl
答案 1 :(得分: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
答案 2 :(得分:5)
如果只有COM DLL,则无法生成类型库。类型库描述了实现的COM接口。但是,非托管COM DLL只需要公开DllGetClassObject
。这只会给你一个IClassFactory
,如果你事先知道正确的类型,你可以创建新对象。
答案 3 :(得分:5)
如果类型库嵌入在DLL资源中并且TLB文件本身是必需的,那么第三方软件可以提取它(但是,正如其他人所指出的,这可能不是最理想的选项)。
E.g。使用Resource Hacker:
您现在可以引用该.TLB文件并构建而无需原始DLL,例如
#import "test.tlb" named_guids
答案 4 :(得分:3)
Visual Studio IDE可以直接从非托管的.exe和.dll文件中提取二进制资源。 如果类型库在非托管 COM DLL(例如使用VS本机C ++编译器构建的COM DLL)中保存为二进制资源,则可以按如下方式提取它:
"TYPELIB"
,然后1
)。export
。这会打开一个“将文件另存为”对话框。bin1.bin
)更改为MyLibrary.tlb
,然后单击“确定”。OleView.exe
打开导出的.tlb文件进行确认(结果应与您使用OleView.exe
打开.dll时看到的结果相同)。要从托管 DLL(例如,使用C#构建的DLL)中提取类型库,VS包含工具Tlbexp.exe
(从VS命令提示符运行它):
https://msdn.microsoft.com/en-us/library/hfzzah2c(v=vs.110).aspx