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)
如果只有COM DLL,则无法生成类型库.类型库描述了实现的COM接口.但是一个非托管的COM DLL只需要公开DllGetClassObject
.这只能让你获得一个IClassFactory
,如果你预先知道正确的类型,它可以让你创建新的对象.
如果类型库嵌入在DLL资源中并且TLB文件本身是必需的,那么第三方软件可以提取它(尽管如其他人所指出的,这可能不是最理想的选择).
例如,使用Resource Hacker:
您现在可以在不需要原始DLL的情况下引用.TLB文件和构建,例如
#import "test.tlb" named_guids
Run Code Online (Sandbox Code Playgroud)
小智 5
Visual Studio IDE可以直接从非托管.exe和.dll文件中提取二进制资源。如果类型库作为二进制资源保存在非托管COM DLL 中(例如使用 VS 本机 C++ 编译器构建的DLL),则可以按如下方式提取它:
"TYPELIB"
,然后)。1
export
。这会弹出一个“文件另存为”对话框。bin1.bin
)更改为类似名称MyLibrary.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
归档时间: |
|
查看次数: |
24740 次 |
最近记录: |