web-dev-qa-db-de.com

Wie verwende ich <DllImport> in VB.NET?

Wie soll ich DLLImport Dinge in VB.NET ? Ein Beispiel wäre:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer

End Function

Wenn ich es in einer Klasse oder anderswo ablege, erhalte ich "DLLimport ist nicht definiert". Ich verwende Visual Studio 2008 Professional

25
MilMike

Sie müssen Imports System.Runtime.InteropServices Am Anfang Ihrer Quelldatei einfügen.

Alternativ können Sie den Attributnamen vollständig qualifizieren:

<System.Runtime.InteropService.DllImport("user32.dll", _
    SetLastError:=True, CharSet:=CharSet.Auto)> _
36
Anton Gogolev
Imports System.Runtime.InteropServices
7
Luhmann

Ich habe in getwindowtext (user32) auf pinvoke.net gesehen, dass Sie eine MarshalAs Anweisung setzen können, um anzugeben dass der StringBuffer LPSTR entspricht.

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)> _
Public Function GetWindowText(hwnd As IntPtr, <MarshalAs(UnManagedType.LPStr)>lpString As System.Text.StringBuilder, cch As Integer) As Integer
End Function
5
Nap

Ich weiß, dass dies bereits beantwortet wurde, aber hier ist ein Beispiel für die Leute, die versuchen, SQL Server Types in einem vb-Projekt zu verwenden:

            Imports System
            Imports System.IO
            Imports System.Runtime.InteropServices

            Namespace SqlServerTypes
                Public Class Utilities



                    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
                    Public Shared Function LoadLibrary(ByVal libname As String) As IntPtr

                    End Function

                    Public Shared Sub LoadNativeAssemblies(ByVal rootApplicationPath As String)
                        Dim nativeBinaryPath = If(IntPtr.Size > 4, Path.Combine(rootApplicationPath, "SqlServerTypes\x64\"), Path.Combine(rootApplicationPath, "SqlServerTypes\x86\"))
                        LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll")
                        LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial140.dll")
                    End Sub

                    Private Shared Sub LoadNativeAssembly(ByVal nativeBinaryPath As String, ByVal assemblyName As String)
                        Dim path = System.IO.Path.Combine(nativeBinaryPath, assemblyName)
                        Dim ptr = LoadLibrary(path)

                        If ptr = IntPtr.Zero Then
                            Throw New Exception(String.Format("Error loading {0} (ErrorCode: {1})", assemblyName, Marshal.GetLastWin32Error()))
                        End If
                    End Sub
                End Class
            End Namespace
2
Todd Harvey

Sie können dies auch versuchen

Private Declare Function GetWindowText Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer

Ich benutze immer Declare Function anstelle von DllImport ... Es ist einfacher, es ist kürzer und macht dasselbe

2