web-dev-qa-db-fra.com

Comment utiliser <DllImport> dans VB.NET?

Comment dois-je DLLImport choses dans VB.NET ? Un exemple serait:

<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

Si je le mets dans une classe ou ailleurs, j'obtiens "DLLimport n'est pas défini" J'utilise Visual Studio 2008 Professional

25
MilMike

Vous devez ajouter Imports System.Runtime.InteropServices en haut de votre fichier source.

Alternativement, vous pouvez entièrement qualifier le nom d'attribut:

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

J'ai vu dans getwindowtext (user32) sur pinvoke.net que vous pouvez placer une instruction MarshalAs pour indiquer que le StringBuffer est équivalent à LPSTR.

<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

Je sais que cela a déjà été répondu, mais voici un exemple pour les personnes qui essaient d'utiliser les types SQL Server dans un projet vb:

            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

Vous pouvez également essayer ceci

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

J'utilise toujours Declare Function au lieu de DllImport ... C'est plus simple, plus court et fait de même

2
Christopher Aicher