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相当于static是Shared.所以你的声明应该是这样的:
<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函数返回的桌面窗口!很多人滥用它,大多数时候,当我看到人们试图找回它的手柄时,这表明他们已经做错了.(不是说你是,因为我看不到你的其余代码,只是需要注意的事情!)
| 归档时间: |
|
| 查看次数: |
7802 次 |
| 最近记录: |