2015-04-07 57 views
1

在我的程序中,我有一些DllImport,因爲我想調用一些本機API。 int類型用於返回類型的方法參數&。直到我在新的Windows 2012 R2服務器(64位)上運行我的應用程序之前,它工作得很好。當我將ref參數的類型中的一個從int更改爲IntPtr時,問題得到解決。我們可以用DllImport方法簽名中的「IntPtr」替換所有「int」參數和返回類型嗎?

我知道IntPtr是用來表示一個指針或句柄。 但是,MSDN也表示IntPtr是「設計爲一個整數」,其大小是平臺特定的。因此,如果IntPtr能夠處理平臺特定大小的整數,是否可以將所有int參數&返回類型替換爲IntPtr

我正在使用C#.NET 4.0。

+0

它可能會工作,但正確的方法是在msdn上查找方法的簽名,然後檢查類型概述tqble以查看具有本機大小的類型概述。 – CodesInChaos

回答

3

不,你不能盲目做這件事。 64位代碼仍然大量使用32位整數類型,其「本地整數」仍然是32位值。如果您在本地代碼聲明(或等效的typedef別名)中看到intlong,則仍然在您的pinvoke聲明中使用int

儘管對於64位編譯器來說這聽起來不是一件非常明智的事情,但他們沒有升級其本地整數類型的原因有很好的理由。現代處理器速度非常快,但受限於其處理內存的速度。他們的執行引擎以千兆赫茲的速度運行,但內存總線速度很慢。與距離相關的電氣設計問題,信號不得不越移越慢,它需要改變狀態,以在導線的另一端仍能正確識別。一個問題部分通過使用緩存,位於執行引擎附近的內存副本解決。這些緩存的大小不會增加一倍。有效使用高速緩存非常重要,因此在可能的情況下使用32位整數值非常重要。

的本機類型的示例IntPtr是任何指針類型,size_t,XXX_PTR,WPARAM,LRESULT。後者是typedef,它們可以使識別底層類型變得困難。如果有疑問,寫一個使用sizeof的C程序,這樣你就知道了一個事實。

正式定義是由64位本機編譯器使用的data model。微軟編譯器使用LLP64。

1

是確定以替換所有int參數&返回類型與IntPtr的

不,它不是。您需要分別查看每個用例。在需要指針(例如接收輸出)的情況​​下,IntPtr更可能是正確的,因爲它將根據您找到的平臺指針寬度正確調整大小。

C#intis 32-bits無論底層操作系統是32位還是64位,並且將匹配Win32 API中相應的固定寬度參數類型。 LONGDWORD作爲其無符號等效項的一個示例。有are others,其他許多...

相關問題