Вопрос

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

Спасибо

Это было полезно?

Решение

Поскольку 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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top