Как создать библиотеку типов из неуправляемой COM-библиотеки dll

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

В regsvr32 нет возможности генерировать библиотеку типов.

Спасибо, С наилучшими пожеланиями, Robo.

Ответ 1

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

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

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

ildasm Interop.Foo.dll /out=Foo.il

Ответ 2

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

midl /out c:\temp /header MyHeader.h MyIDLFile.idl

Ответ 3

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

Ответ 4

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

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

  • Откройте DLL файл.
  • Перейдите в TYPELIB\1\1033 (или что-то еще) node в древовидном представлении.
  • В меню выберите "Действие" → "Сохранить ресурс" в виде двоичного файла...
  • Выберите имя файла и дайте ему расширение .TLB.

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

#import "test.tlb" named_guids

Ответ 5

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

  • Откройте DLL файл в редакторе ресурсов VS (редактор по умолчанию при открытии исполняемых файлов).
  • Перейдите к ресурсу библиотеки типов ("TYPELIB", затем 1) в дереве ресурсов.
  • Щелкните правой кнопкой мыши ресурс библиотеки типов и выберите export. Появится диалоговое окно "Сохранить файл как".
  • В поле "Сохранить файл как" измените имя файла по умолчанию (обычно, bin1.bin) на что-то вроде MyLibrary.tlb и нажмите "ОК".
  • Подтвердите, открыв экспортированный .tlb файл с помощью OleView.exe (результаты должны выглядеть идентично тем, которые вы видите, открыв .dll с помощью OleView.exe).

Чтобы извлечь библиотеки типов из управляемых DLL (например, построенных с использованием С#), VS включает инструмент Tlbexp.exe (запустите его из командной строки VS): https://msdn.microsoft.com/en-us/library/hfzzah2c(v=vs.110).aspx