2012-02-05 1 views
2

В настоящее время я создаю мой собственный IntelliSense, и был немного неуверен в точке:вытягивать информацию из библиотеки DLL файлов/заголовки

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

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

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

+2

.Net и Java и C++ не имеют отношения друг к другу. О чем именно вы спрашиваете? – SLaks

+1

Я уверен, что вам придется сканировать заголовки. Получение данных из двоичного C++ будет затруднено (большая часть вашего материала уходит во время компиляции). – Lalaland

+0

VC++ IDE просто анализирует файлы заголовков, он не рассматривает никакие двоичные файлы. VC#, хотя и только потому, что сборки .NET почти полностью отличаются от обычных исполняемых файлов. –

ответ

1

Скомпилированные сборки .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, но я не смотрел ее под капот. Там должны быть какие-то интересные части, которые там скрыты, но сделайте собственное исследование.

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

  1. Visual Studio SDK. Даже если вы не продлеваете визуальную студию, вы можете прочитать ее документацию. В нем есть раздел о Intellisense. Кроме того, посмотрите на IDE с открытым исходным кодом, такие как Eclipse и #develop

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

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

+0

Спасибо за ответ, это именно то, что я искал. Извините за любую путаницу в исходном сообщении – LynchDev