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

Я должен использовать стороннюю, неуправляемую com dll в моем приложении .NET. Мне нужно изменить эту сборку, чтобы создать пользовательские RCW. Для того, чтобы Редактировать Сборку Взаимодействия мне нужна библиотека типов конкретной сборки. Может ли кто-нибудь объяснить мне, как создать библиотеку типов из неуправляемой com dll?

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

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

5 ответов


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

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

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

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

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

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

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


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

Е. Г. используя Хакер Ресурсов:

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

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

#import "test.tlb" named_guids

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

  1. открыть .dll файл в VS редактор ресурсов (редактор по умолчанию при открытии исполняемых файлов).
  2. перейдите к ресурсу библиотеки типов ("TYPELIB", потом 1) в дереве ресурсов.
  3. щелкните правой кнопкой мыши на ресурсе библиотеки типов и выберите export. Это вызывает диалоговое окно "Сохранить файл как".
  4. в поле" Сохранить файл как " измените имя файла по умолчанию (обычно bin1.bin) что-то вроде MyLibrary.tlb и нажмите Ok.
  5. подтвердите, открыв экспортированный .файл TLB с OleView.exe (результаты должны выглядеть идентично тем, которые вы видите, открыв .dll с OleView.exe).

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