Как сгенерировать библиотеку типов из неуправляемых COM DLL - PullRequest
14 голосов
/ 14 февраля 2011

Я должен использовать стороннюю неуправляемую DLL-библиотеку COM в своем приложении .NET. Мне нужно изменить эту сборку для получения пользовательского RCW . Чтобы Редактировать Interop Assembly , мне нужна библиотека типов конкретной сборки. Может ли кто-нибудь объяснить мне, как Как создать библиотеку типов из неуправляемых COM DLL?

В regsvr32 нет опции для создания библиотеки типов.

Спасибо, С уважением, Robo.

Ответы [ 5 ]

14 голосов
/ 14 февраля 2011

Вам необходим OLE-COM Object Viewer , доступный как часть последней версии Windows SDK .Затем вы можете перейти в File-> View Type Lib и сохранить IDL в текстовый файл.Затем вы можете использовать MIDL (также часть Windows SDK) для восстановления TLB и файла заголовка.Нечто подобное следует делать для базовых случаев:

midl /out c:\temp /header MyHeader.h MyIDLFile.idl
6 голосов
/ 24 февраля 2011

Если все, что вы пытаетесь сделать, это создать Interop Assembly из собственной dll (а нативная DLL встраивает TLB в качестве ресурса), вы можете просто вызвать tlbimp непосредственно в dll:

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

Который будет генерировать Interop.Foo.dll. Затем вы можете использовать ildasm для изменения IL:

ildasm Interop.Foo.dll /out=Foo.il
5 голосов
/ 22 апреля 2014

Если typelib встроен в ресурсы DLL, а сам файл TLB - это то, что требуется, тогда стороннее программное обеспечение может извлечь его (хотя, как отмечали другие, это может быть не самым желательным вариантом).

например. используя Resource Hacker :

  1. Откройте файл DLL.
  2. Перейдите к узлу TYPELIB \ 1 \ 1033 (или какому-либо другому) в древовидном представлении.
  3. В меню выберите «Действие» -> «Сохранить ресурс как двоичный файл» ...
  4. Выберите имя файла и присвойте ему расширение .TLB.

Теперь вы можете ссылаться на этот файл и сборку .TLB, не требуя оригинальной DLL, например,

#import "test.tlb" named_guids
5 голосов
/ 14 февраля 2011

Если все, что у вас есть, это COM DLL, вы не можете сгенерировать библиотеку типов. Библиотека типов описывает реализованные интерфейсы COM. Но неуправляемая COM DLL просто должна предоставить DllGetClassObject. Это только дает вам IClassFactory, который позволяет вам создавать новые объекты, если вы заранее знаете правильный тип.

3 голосов
/ 06 февраля 2017

Visual Studio IDE может напрямую извлекать двоичные ресурсы из неуправляемых файлов .exe и .dll.Если библиотека типов сохранена как двоичный ресурс в неуправляемой COM DLL (например, созданной с использованием собственного компилятора C ++ VS), вы можете извлечь ее следующим образом:

  1. Откройте файл .dll в редакторе ресурсов VS (редактор по умолчанию при открытии исполняемых файлов).
  2. Перейдите к ресурсу библиотеки типов ("TYPELIB", затем 1) в ресурсеtree.
  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

...