2012-06-21 79 views
3

雖然通過SWig生成的包裝器,但我發現PInvokes沒有任何入口點,但是有些地方我發現它們使用Entrypoint進行了定義。那麼,它們之間的區別,例如:爲什麼我需要使用EntryPoint屬性來定義DLLImport

//定義不切入點

[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)] 
    public static extern bool ReadFile(
     HandleRef hndRef, 
     StringBuilder buffer, 
     int numberOfBytesToRead, 
     out int numberOfBytesRead, 
     int flag); 

//與入口點定義

[DllImport("Kernel32.dll", CharSet = CharSet.Unicode, EntryPoint = "ReadFile")] 
    public static extern bool ReadFile2(
     HandleRef hndRef, 
     StringBuilder buffer, 
     int numberOfBytesToRead, 
     out int numberOfBytesRead, 
     Overlapped2 flag); 

}

也是爲什麼函數必須是靜態的,如在公共靜態外部?根據extern的考慮,我認爲它告訴編譯器這個方法是由externaly定義的?

+0

在您發佈的示例中,您正在導入相同的方法。這允許你有兩個不同的實現。這是代碼生成器基本上無用的原因,如果你不瞭解它們生成的代碼。 –

回答

10

EntryPoint字段用於告訴.NET運行時從調用的DLL調用哪個函數;如果未設置,則默認與.NET方法聲明具有相同的名稱。在第二個示例中,省略EntryPoint = "ReadFile"將導致運行時嘗試調用名爲ReadFile2(不存在)的函數。

該原型需要有staticextern修飾符,因爲specification這樣說。它不需要是public;控制方法的可見性完全取決於你。

相關問題