Зачем использовать атрибут DllImport как приложение для добавления ссылки?

Я видел пару примеров, например это:

[DllImport("user32.dll")]
static extern bool TranslateMessage([In] ref Message lpMsg);

[DllImport("user32.dll")]
static extern IntPtr DispatchMessage([In] ref Message lpmsg);

но я не понимаю, почему кто-то будет делать это как приложение для ссылки на DLL, как они делают другие библиотеки? MSDN заявляет: "атрибут DllImport очень полезен при повторном использовании существующего неуправляемого кода в управляемом приложении. Например, управляемому приложению может потребоваться выполнить вызовы неуправляемого API WIN32."Но, это говорит, что не полезно ссылаться на неуправляемую dll или иначе невозможно?

4 ответов


" но, это говорит, что это не полезно для ссылки на неуправляемую dll или иначе невозможно?"

да, именно так. То, что вы считаете "ссылкой на DLL", на самом деле является "ссылкой на сборку .NET" - так получилось, что наиболее распространенный способ упаковки сборок, на которые обычно ссылаются, находится в DLL.

DLLImport полностью об импорте "традиционных DLL" - т. е. тех, которые экспортируют все свои методы, используя оригинальный механизм экспорта DLL Windows.

подумайте о DLLImport как о том, что на самом деле называется "UnmanagedImport", и все может быть яснее.


некоторые библиотеки, такие как библиотека user32.dll-это неуправляемый код. В основном это означает, что у них нет необходимых метаданных, позволяющих .Net разговаривать с ними по ссылке (есть гораздо больше, что входит в него, но, надеюсь, это дает вам достаточно фору.)


в двух словах:

  • добавить ссылку используется для: DLL файлы, содержащие управляемого кода

  • DllImport используется для: DLL-файлов, содержащих неуправляемый код

определение:

Управляемого Кода код, который будет запуск только под управлением виртуальной машины Общеязыковой среды выполнения (CLR), обычно .NET Framework (или моно).

Неуправляемый Код: все скомпилированные двоичные файлы, работающие непосредственно в ОС; DLL, скомпилированные с использованием чего-либо старше Visual Studio .NET 2002.

Подробнее: управляемый, неуправляемый, родной: что это за код?


код платформы .NET компилируется в управляемый код и хранится с помощью сборок, это сборки.DLL файлы, но не все .DLL-файлы-это сборки, содержащие управляемый код. Вы можете использовать управляемый код только со стилем "добавить ссылку".

другие языки и методы разработки генерирует .DLL файлы с неуправляемым кодом, на самом деле вы даже можете взаимодействовать (методы вызова) с ними, но вам нужен атрибут DLLImport