Зачем использовать атрибут DllImport для добавления ссылки? - PullRequest
11 голосов
/ 24 июля 2010

Я видел пару примеров, таких как:

[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 ]

26 голосов
/ 24 июля 2010

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

Да, именно так.То, что вы называете «ссылкой на DLL», на самом деле является «ссылкой на сборку .NET» - так уж сложилось, что самый распространенный способ упаковки типов сборок, на которые обычно ссылаются, - это DLL.

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

Думайте о DLLImport как о фактическом названии «UnmanagedImport», и все может быть яснее.

14 голосов
/ 24 июля 2010

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

11 голосов
/ 28 апреля 2016

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

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

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

Определения:

Управляемый код : код, который будет выполнятьсятолько под управлением виртуальной машины Common Language Runtime (CLR) , обычно .NET Framework (или Mono ).

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

Подробнее: Управляемый, Неуправляемый, Собственный: Что это за код?

2 голосов
/ 24 июля 2010

Код платформы .NET компилируется в управляемый код и сохраняется с использованием сборок. Эти сборки представляют собой файлы .DLL, НО НЕ ВСЕ файлы .DLL являются сборками, содержащими управляемый код. Вы можете использовать только управляемый код в стиле «Добавить ссылку».

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

...