Скомпилированные сборки .NET и классы Java содержат всю метаинформацию о классах и символах, которые они определяют. Для ссылок на них не требуется никаких файлов .h или .lib. Для этих типов модулей информация о значительном количестве может быть извлечена непосредственно из них.
Я не знаю, если Visual Studio является, используя отражение для чтения метаданных из управляемых сборок, но отражение, безусловно, является правильным механизмом для применения в этом случае. Но также обратите внимание, что VS отображает больше информации, чем содержится в сборке напрямую, а именно ///
doc-comments. Они могут поступать из исходных файлов в другие проекты в решении и из отдельных файлов .XML, которые поставляются с сборками.
Для C и C++ дело иное. В DLL имеется мало информации. Существуют символы экспорта, но обычно они не сигнализируют, является ли символ функцией или просто extrn, и сколько аргументов и какие типы выполняет функция. C++ использует так называемые «искаженные» имена, из которых можно получить некоторую информацию. Но большая часть информации, доступной о библиотеке, поступает из файлов заголовков. VS, насколько мне известно, разбирает файлы проектов и .h файлов, включенных в код, для получения базы данных intellisense. Существуют макросы (#define
), а также встроенные и шаблонные классы и функции, которые вообще не отражаются на внешних символах DLL.
Для управляемых и неуправляемых сборок, иногда отладочной информации доступны файлы PDB. Опять же, я не уверен, но я думаю, что VS не использует их для intellisense. Это не значит, что вы не должны. Там содержится расширенная информация о внешних переменных, классах, функциях и методах. В общем, нет «стандартного» подхода intellisense, и вам, вероятно, следует рассмотреть возможность использования нескольких источников для символической исходной информации.
К сожалению, я не знаю много о Java, чтобы дать подробный ответ на эту часть вашего вопроса. Кроме того, существует популярная среда IDE под названием Eclipse, но я не смотрел ее под капот. Там должны быть какие-то интересные части, которые там скрыты, но сделайте собственное исследование.
Несколько полезных ссылок:
Visual Studio SDK. Даже если вы не продлеваете визуальную студию, вы можете прочитать ее документацию. В нем есть раздел о Intellisense. Кроме того, посмотрите на IDE с открытым исходным кодом, такие как Eclipse и #develop
System.Diagnostics.SymbolStore Namespace содержит классы для доступа к файлам PDB. В неуправляемом мире используйте DbgHelp library, часть Windows SDK.
Утилита под названием Depends была частью Win32 SDK и теперь доступна отдельно. Он показывает внешние значения, определенные неуправляемой DLL.This SO discussion раскрывает несколько способов доступа к этой информации программно. DbgHelp содержит функции для отмены символов C++ после их извлечения из каталога экспорта PE.
.Net и Java и C++ не имеют отношения друг к другу. О чем именно вы спрашиваете? – SLaks
Я уверен, что вам придется сканировать заголовки. Получение данных из двоичного C++ будет затруднено (большая часть вашего материала уходит во время компиляции). – Lalaland
VC++ IDE просто анализирует файлы заголовков, он не рассматривает никакие двоичные файлы. VC#, хотя и только потому, что сборки .NET почти полностью отличаются от обычных исполняемых файлов. –