2012-03-05 1 views
5

В чем разница между использованием DllImport здесь? В частности, «user32» означает «user32.dll», или это означает «user32.lib» или что-то еще?DllImport user32 vs user32.dll

[DllImport("user32")] 
protected static extern int GetKeyboardState(byte[] pbKeyState); 

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
protected static extern short GetKeyState(int vKey); 

Возможно, вы можете игнорировать CharSet и CallingConvention.

Если они такие же, я могу переписать это, чтобы быть более последовательным, но если нет, я не хочу иметь с ним множество проблем.

+0

[Здесь находится страница MSDN на конструкторе] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx) для справки. – Guvante

+0

Соответствующая документация предназначена для [LoadLibrary] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175 (v = vs.85) .aspx). * Если строка указывает имя модуля без пути, а расширение имени файла опущено, функция добавляет расширение DLL библиотеки DLL к имени модуля. Чтобы предотвратить добавление функции .dll в имя модуля, добавьте символ строки (.) В строку имени модуля. * –

ответ

11

В этом примере нет разницы. Расширение .dll будет автоматически добавлено к "user32", чтобы создать "user32.dll". Тем не менее, это не всегда так. Если имя файла библиотеки содержит период, расширение .dll будет автоматически добавлено , а не.

Некоторые примеры:

[DllImport("user32")] -> рассасывает "User32.dll". Верный.

[DllImport("user32.dll")] -> Устанавливает "User32.dll". Верный.

[DllImport("mylib.version5")] -> Устанавливает "mylib.version5". Неверный

[DllImport("mylib.version5.dll")] -> Устраняет "mylib.version5.dll". Верный.

+0

Кажется, что в реализации Mono .NET периоды в имени библиотеки не предотвращают автоматическое добавление расширения. (По крайней мере, в версии Mono, используемой в Unity 4.5.1, которая, я считаю, является вариантом Mono 3.0.) – yoyo

+0

+1 для «периода в имени файла библиотеки», часами царапает мне голову о том, что теперь довольно очевидна). – helmesjo

1

В Windows нет разницы, импорт будет выполнен успешно, если вы опустите расширение. Обычно при удалении расширения желательно использовать Mono с разделом конфигурации <dllmap>, где время выполнения P/Invoke будет искать псевдонимы.