2014-01-22 136 views
3

我一直在c#中編寫了一段代碼,但是我碰到了一些代碼,它根本沒有任何意義。它看起來像下面這樣:瞭解C#代碼片段

[DllImport(DllName, SetLastError = true, 
    CallingConvention=CallingConvention.Cdecl)] 
static extern byte QLIB_UploadCEFS_File(UInt32 handle, string sFileName, 
    string sPartitionFileName); 

我不知道如何解釋這段代碼。任何人都可以解釋我在這裏想要達到什麼目的嗎?

+1

http://msdn.microsoft.com/en-us/magazine/cc164123.aspx –

回答

11

這是一個P/Invoke聲明。它聲明瞭一個在該模塊外部的函數,它在非託管DLL中實現。

DllImport屬性指定在此實例中的非託管DLL的名稱,DllName。在這種情況下,DllImport屬性的其他屬性指定了調用約定,並且該函數設置了Win32的最後一個錯誤變量。

函數聲明本身指定了非託管函數的簽名。在這種情況下,參數意味着功能具有以下非託管聲明:

unsigned char QLIB_UploadCEFS_File(
    unsigned int handle, 
    const char *sFileName, 
    const char *sPartitionFileName 
); 

從調用該函數的託管代碼的角度來看,它只是像任何其他功能。您將其稱爲傳遞參數,如您的問題代碼中所指定的那樣。


對於什麼是值得的,我懷疑這個聲明是不正確的。第一個參數是一個句柄,它們幾乎總是指針大小。所以,雖然代碼可能在32位以下,但很可能會破壞64位。我期望看到第一個參數被宣佈爲IntPtr。當然,這是猜測,因爲我看不到實際的非託管函數聲明。

+0

非常感謝您的解釋。你可以給我一個關於這個呼叫功能的例子嗎? – TeaLeave

+1

調用此外部函數的C#函數?它就像任何其他C#函數調用一樣。 –

+0

byte b = QLIB_UploadCEFS_File(h,「c:\\ dir \\ file.txt」,「d:\\ dir \ file2.txt」); – Jay