2012-03-05 105 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 2012-03-05 22:28:38

+0

相關文檔是[LoadLibrary](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v = vs.85).aspx)。 *如果字符串指定一個沒有路徑的模塊名稱,並且省略了文件擴展名,則該函數會將缺省庫擴展名.dll附加到模塊名稱中。爲防止函數將.dll附加到模塊名稱中,請在模塊名稱字符串中包含尾隨點字符(。)。* – 2012-03-06 18:51:40

回答

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

似乎在.NET的Mono實現中,庫名稱中的句點不會阻止自動附加擴展。 (至少在Unity 4.5.1中使用的Mono版本中,我相信它是Mono 3.0的一個變體)。 – yoyo 2014-09-10 00:55:48

+0

+1爲「庫文件名稱的期間」,一直在爲我的頭幾個小時而撓頭現在相當明顯)。 – helmesjo 2016-08-08 21:19:57

1

在Windows上沒有區別,如果省略擴展名,導入將成功執行。當運行Mono時,通常省略擴展名爲<dllmap>配置部分,其中P/Invoke運行時將查找別名。