Извлечение информации из DLL / заголовочных файлов - PullRequest
2 голосов
/ 06 февраля 2012

В настоящее время я создаю свой собственный intellisense, и немного сомневаюсь по этому вопросу:

VS Intellisense может просматривать библиотеки DLL, на которые ссылаются, и извлекать из них пространства имен, классы и т. Д.Это делает это с отражением?Что, если я добавлю DLL, созданную в java (если это можно сделать?)

для C ++, включает ли заголовочные файлы для простого сканирования intellisense, которые вы #include, и из этого находите доступные пространства имен, классы и т. Д.

Меня не совсем волнует точная реализация intellisense в visual studio, но мне интересно, как он получает свои данные.

1 Ответ

1 голос
/ 06 февраля 2012

Скомпилированные сборки .NET и классы Java содержат всю мета-информацию о классах и символах, которые они определяют.Ничего подобного файлам .h или .lib не требуется ссылаться на них.Для этих типов модулей может быть извлечено значительное количество информации непосредственно из них.

Я не знаю, является ли Visual Studio с использованием отражения для чтения метаданных из управляемых сборок, но отражение, безусловно, являетсяправильный механизм для применения в этом случае.Но также обратите внимание, что VS отображает больше информации, чем содержится непосредственно в сборке, а именно, /// doc-comments.Они могут исходить из исходных файлов в других проектах решения и из отдельных файлов .XML, поставляемых со сборками.

Для C и C ++ дело обстоит иначе.В одной только DLL мало информации.Существуют символы экспорта, но они обычно не сигнализируют, является ли символ функцией или просто извлечением, и сколько аргументов и какие типы принимает функция.C ++ использует так называемые искаженные имена, из которых может быть получена некоторая информация.Но большая часть информации о библиотеке поступает из заголовочных файлов.Насколько я знаю, VS анализирует исходные файлы проектов и файлы .h, включенные в код, чтобы получить базу данных intellisense.Существуют макросы (#define), а также встроенные и шаблонные классы и функции, которые вообще не отражаются в внешних символах DLL.

Как для управляемых, так и для неуправляемых сборок иногда доступны файлы PDB с отладочной информацией.Опять же, я не уверен, но я думаю, что VS не использует их для intellisense.Это не значит, что вы не должны.Там содержится расширенная информация о внешних переменных, классах, функциях и методах.В общем, нет «стандартного» подхода intellisense, и вам, вероятно, следует рассмотреть возможность использования нескольких источников для информации о символьных источниках.

К сожалению, я не очень разбираюсь в Java, чтобы дать подробный ответ на эту часть.вашего вопроса.Кроме того, существует популярная среда IDE под названием Eclipse, но я не заглянул за ее пределы.Там должно быть скрыто несколько интересных частей, но проведите собственное исследование.

Несколько полезных ссылок:

  1. Visual Studio SDK .Даже если вы не расширяете визуальную студию, вы можете прочитать ее документацию.Есть раздел по Intellisense.Также обратите внимание на IDE с открытым исходным кодом, такие как Eclipse и #velop

  2. Пространство имен System.Diagnostics.SymbolStore содержит классы для доступа к PDBфайлы.В неуправляемом мире используйте библиотеку DbgHelp , часть Windows SDK.

  3. Утилита с именем Зависит от была частью Win32 SDK и доступнаотдельно сейчас.Он показывает внешние элементы, определенные неуправляемой DLL. Это обсуждение SO раскрывает несколько способов программного доступа к этой информации.DbgHelp содержит функции для удаления имен C ++ после их извлечения из директории экспорта PE.

...