Как создать библиотеку типов из неуправляемой 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