Компиляция в Visual Studio 2005 и Visual C ++ 6.0 - PullRequest
1 голос
/ 21 января 2010
  1. В чем разница создания простой C DLL-библиотеки между использованием Visual Studio 2005 и Visual C ++. Я увидел, что при создании его в студии также был создан манифест, и у меня возникли некоторые проблемы с развертыванием на другой машине из-за использования папки рядом (при вызове этой dll из приложения C # "
  2. Как работает механизм вызова dll?

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 января 2010

Да, если вы компилируете код DLL с помощью / MD (настройка по умолчанию), вам нужно развернуть библиотеки CRT на целевом компьютере. Если это просто автономная библиотека DLL без каких-либо других зависимостей, то имеет смысл скомпилировать с параметром статического CRT, чтобы вам не пришлось развертывать библиотеки. Щелкните правой кнопкой мыши ваш проект DLL, Свойства, C / C ++, Генерация кода, Runtime Library = / MTd для конфигурации отладки. Повторите для конфигурации выпуска, теперь используя /MT.

Google "P / Invoke marshaling", чтобы узнать больше о том, как неуправляемый код вызывается из управляемой программы.

1 голос
/ 21 января 2010

Поскольку nobugz уже рассмотрел ваш первый вопрос, позвольте мне остановиться на втором. Это не очень сложно понять.

Когда вы компилируете DLL в Windows, компоновщик создает таблицу адресов экспорта (EAT), в которой перечисляются все экспортируемые функции (функции, которые предоставляет DLL) и указатель того, где они реализованы в самой DLL.

При компиляции приложения, которое ссылается на DLL, компоновщик создает таблицу адресов импорта (IAT) со списком всех функций, которые реализованы в других DLL, и именем библиотеки DLL, которая реализует эти функции. Он знает, что функция существует в DLL, из .lib-файла, который вы добавляете в свой проект. Это говорит компоновщику, что функция реализована в DLL.

Затем во время выполнения при загрузке приложения загрузчик Windows проверяет IAT, чтобы узнать, какие DLL нужно загрузить, находит их и обновляет IAT приложения (в памяти), чтобы указывать на экспортируемые функции в загруженной DLL.

Вот основы того, как это работает, надеюсь, я не учел грубых неточностей. И, конечно, P / Invoke - еще один слой поверх этого.

Если вам нужна дополнительная информация о том, как работает DLL, всегда есть документация MSDN , и если вам нужно достаточно подробностей, чтобы заставить вас раскрутиться, прочитайте эти статьи Inside Windows Часть 1 и часть 2

...