Как использовать <DllImport>в VB.NET? - PullRequest
25 голосов
/ 09 февраля 2010

Как мне DLLImport вещи в VB.NET ? Примером может быть:

<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

Если я помещаю его в класс или где-то еще, я получаю «DLLimport не определен», я использую Visual Studio 2008 Professional

Ответы [ 5 ]

36 голосов
/ 09 февраля 2010

Вы должны добавить Imports System.Runtime.InteropServices в начало вашего исходного файла.

Кроме того, вы можете полностью указать имя атрибута:

<System.Runtime.InteropService.DllImport("user32.dll", _
    SetLastError:=True, CharSet:=CharSet.Auto)> _
7 голосов
/ 09 февраля 2010
Imports System.Runtime.InteropServices
5 голосов
/ 17 февраля 2012

Я видел в getwindowtext (user32) на pinvoke.net, что вы можете поместить оператор MarshalAs, чтобы указать, что StringBuffer эквивалентен 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
2 голосов
/ 31 мая 2018

Я знаю, что на это уже ответили, но вот пример для людей, которые пытаются использовать типы SQL Server в проекте 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 голосов
/ 15 июня 2016

Вы также можете попробовать это

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

Я всегда использую Объявление функции вместо DllImport ... Это проще, короче и делает то же

...