C#DLLImport转换为VB.NET DLLImport ...我错过了什么?

ric*_*ard 3 vb.net pinvoke interop dllimport c#-to-vb.net

在C#我有这个:

[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
    public static extern IntPtr GetDesktopWindow();
Run Code Online (Sandbox Code Playgroud)

我试图转换为VB.NET因此:

<DllImport("user32.dll", EntryPoint:="GetDesktopWindow")>
Function GetDesktopWindow() As IntPtr
End Function
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误......"Imports System.Runtime.InteropServices.DllImportAttribute不能应用于实例方法."

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

谢谢!

Cod*_*ray 12

您忘记将static关键字从C#声明转换为VB.NET.这就是错误消息告诉你的内容.除非您有静态方法,否则您将声明实例方法,并且DllImportAttribute无法应用于实例方法.

在VB.NET相当于staticShared.所以你的声明应该是这样的:

<DllImport("user32.dll", EntryPoint:="GetDesktopWindow")>
Shared Function GetDesktopWindow() As IntPtr
End Function
Run Code Online (Sandbox Code Playgroud)

我不得不指出其他一些事情:

  • 没有必要指定EntryPoint函数声明具有相同名称的时间.不管怎样都不会伤害任何事情,但我觉得它会减少重复并减少错误的机会,如果你省略它.
  • 像这样的P/Invoke声明通常应该进入一个名称类似的静态类NativeMethods(StyleCop强制执行此指南).在VB.NET中,静态类称为模块.所以它看起来像这样:

    Module NativeMethods
        <DllImport("user32.dll")>
        Shared Function GetDesktopWindow() As IntPtr
        End Function
    End Module
    
    Run Code Online (Sandbox Code Playgroud)
  • 在早期版本的VB(VB 10之前的版本,VS 2010附带)中,您需要行继续符,以便将函数声明分解为多行.那些丑陋的疣使它看起来像这样:

    Module NativeMethods
        <DllImport("user32.dll")> _
        Shared Function GetDesktopWindow() As IntPtr
        End Function
    End Module
    
    Run Code Online (Sandbox Code Playgroud)

最后,要非常小心如何使用GetDesktopWindow函数返回的桌面窗口!很多人滥用它,大多数时候,当我看到人们试图找回它的手柄时,这表明他们已经做错了.(不是说你是,因为我看不到你的其余代码,只是需要注意的事情!)

  • 再添加一件事......如果我将它们放入模块中,它将不允许我使用Shared关键字,可能是因为模块已经是静态的并且将该函数声明为Shared是多余的. (5认同)