Как работает DllImport?

Мне нравится понимать, как работает DllImport. Мне нужно простое объяснение на английском языке - это простое объяснение.

Статически ли она связана с экспортированным методом из DLL, например, директива "include file" /статическая библиотека?

Или динамически вызывается метод из DLL, когда он попадает в точку выполнения в программе С#?

Ответ 1

Он использует две основные функции winapi. Сначала LoadLibrary(), функция winapi, которая загружает DLL в процесс. Он использует имя, указанное вами для DLL. Вторая функция GetProcAddress() - функция winapi, которая возвращает адрес функции в DLL. Он использует имя указанной вами функции. Затем выполняются некоторые работы сантехники, которые строят фрейм стека для вызова функции, используя указанные вами аргументы, и вызывает функцию по найденному адресу.

Итак, да, это очень динамично. Это происходит не до тех пор, пока ваш код не приземлится на оператор, вызывающий функцию pinvoked. Техническим термином является "поздняя привязка", а не более обычное раннее связывание, используемое загрузчиком Windows для собственного кода.

Ответ 2

Он динамически вызывает его. DLLimport не встраивает ничего в вашу скомпилированную программу. Поэтому, когда вы используете DLLImport, важно убедиться, что конечный пользователь имеет нужную DLL в нужном месте, или ваша программа не будет работать.

Надеюсь, это поможет вам!

Ответ 3

Последний - вы можете убедиться в этом, указав несуществующее имя dll. Конечно, вы сможете скомпилировать и запустить, но не вызывать функцию, конечно.