2012-07-24 75 views
3

在C#我有這樣的:C#DLLImport轉換爲VB.NET DLLImport ...我錯過了什麼?

[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] 
    public static extern IntPtr GetDesktopWindow(); 

我試圖轉換到VB.NET這樣的:

<DllImport("user32.dll", EntryPoint:="GetDesktopWindow")> 
Function GetDesktopWindow() As IntPtr 
End Function 

但我得到一個錯誤...... 「進口System.Runtime.InteropServices。 DllImportAttribute不能應用於實例方法。「

有些人可以解釋我需要做什麼來解決這個問題,甚至更好,告訴我爲什麼?

謝謝!

回答

10

您忘了將static關鍵字從C#聲明轉換爲VB.NET。這就是錯誤信息告訴你的。除非你有一個靜態方法,否則你聲明瞭一個實例方法,並且DllImportAttribute不能應用於實例方法。

VB.NET等價物staticShared。所以,你的聲明應該是這樣的:

<DllImport("user32.dll", EntryPoint:="GetDesktopWindow")> 
Shared Function GetDesktopWindow() As IntPtr 
End Function 

我不得不指出了幾個其他的事情:

  • 這是不必要的指定EntryPoint當你的函數聲明具有相同的名稱。不是說它無論如何都會傷害任何東西,但是我認爲它可以避免重複,並且可以減少錯誤發生的機率。
  • 像這樣的P/Invoke聲明應該通常進入一個名爲NativeMethods(StyleCop強制執行此指南)的靜態類。在VB.NET中,靜態類稱爲模塊。因此,它應該是這樣的:

    Module NativeMethods 
        <DllImport("user32.dll")> 
        Shared Function GetDesktopWindow() As IntPtr 
        End Function 
    End Module 
    
  • 在舊版本的VB的(預VB 10,隨VS 2010),你需要以分手函數聲明多行,續行字符。那些難看的疣使它看起來像這樣:

    Module NativeMethods 
        <DllImport("user32.dll")> _ 
        Shared Function GetDesktopWindow() As IntPtr 
        End Function 
    End Module 
    

最後,非常小心你如何使用由GetDesktopWindow函數返回桌面窗口Lots of people abuse it,大多數時候當我看到人們試圖檢索句柄時,這表明他們已經在做錯了。 (不是說你是,因爲我看不到剩下的代碼,只是需要注意的東西!)

+0

太棒了,謝謝!我正在使用它在應用程序出現錯誤時獲取屏幕截圖。 :-) – richard 2012-07-24 00:34:39

+5

要添加一件事......如果我把它們放到一個模塊中,它不會允許我使用Shared關鍵字,這可能是因爲一個模塊已經是靜態的,並且將該函數聲明爲Shared是多餘的。 – richard 2012-07-24 03:20:49

+1

+1寫得很漂亮,所有的答案都應該是這樣的! – 2012-07-24 09:40:59