4

在 C# 中,我有这个:

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

因此,我尝试转换为 VB.NET:

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

但我收到一个错误...“Imports System.Runtime.InteropServices.DllImportAttribute 不能应用于实例方法。”

有人可以解释我需要做什么来解决这个问题,甚至更好的是,告诉我为什么?

谢谢!

4

1 回答 1

14

您忘记将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很多人滥用它,而且大多数时候当我看到人们试图找回它的句柄时,这表明他们已经做错了。(不是说你是,因为我看不到你的其余代码,只是需要注意的事情!)

于 2012-07-24T00:22:08.387 回答