· 

VSCodeでvb.net(2)

vb.netアプリから自作DLLを呼び出してみます。

前回の結果から、実行ファイルが、

C:\Users\hoge\Documents\vb-vscode\projects\dllcallstudy1\dllcallapp1\bin\x86\Debug\net5.0

に生成されることがわかったので、こちらに32bit DLLを64bitアプリから使う(1)で作ったMyDLL32.dllをコピペしておきます。

 

そして

Program.vb

Imports System
Imports System.Runtime.InteropServices

Module Program
    Delegate Function tasu_dgt(Byval arg1 As Int32,Byval arg2 As Int32) As Int32
    Delegate Function hiku_dgt(Byval arg1 As Int32,Byval arg2 As Int32) As Int32
    Private ptasu As IntPtr
    Private phiku As IntPtr
    Private tasu As tasu_dgt
    Private hiku As hiku_dgt
    Private _libraryModule_mydll As IntPtr=IntPtr.Zero
    
    <DllImport("kernel32",CharSet:=CharSet.Ansi,SetLastError:=True)>
    Private Function LoadLibrary(Byval lpFileName As String) As IntPtr
    End Function
    <DllImport("kernel32",CharSet:=CharSet.Ansi,SetLastError:=True)>
    Private Function FreeLibrary(Byval hModule As IntPtr) As Boolean
    End Function
    <DllImport("kernel32",CharSet:=CharSet.Ansi,SetLastError:=True)>
    Private Function GetProcAddress(Byval hModule As IntPtr,Byval lpProcName As String) As IntPtr
    End Function
    
    Sub Main(args As String())
        dim wa,sa,arg1,arg2 as Int32
        dim output as String
        Console.WriteLine("Hello World!")
        _libraryModule_mydll=LoadLibrary("MyDLL32.dll")
        ptasu=GetProcAddress(_libraryModule_mydll,"tasu")
        tasu=Marshal.GetDelegateForFunctionPointer(ptasu,GetType(tasu_dgt))
        phiku=GetProcAddress(_libraryModule_mydll,"hiku")
        hiku=Marshal.GetDelegateForFunctionPointer(phiku,GetType(hiku_dgt))
        arg1=20
        arg2=13
        wa=tasu(arg1,arg2)
        sa=hiku(arg1,arg2)
        output=arg1.ToString()&" + "&arg2.ToString()&" = "&wa.ToString
        Console.WriteLine(output)
        output=arg1.ToString()&" - "&arg2.ToString()&" = "&sa.ToString
        Console.WriteLine(output)
    End Sub
End Module

LoadLibrary等はkernel32.dllの機能を使うので静的に読み込みます。自作DLLは動的に読み込みます。実行時にDLLを選ぶ場面って結構あるとおもうので。

、、、そして実行。

あれ?簡単に動いた、、、おかしいな、、、いろいろ謎のコツとかがあって、LoadLibraryとか失敗するんじゃないかと思ってたけど、、、いや、いいことなんですけど、、、

 

 

ところで、VSCodeでVBコードを作成するときに支援してくれる拡張機能ってないんかな。pythonでは出てくるとうざいんだけど、VBは慣れてないので出てきてほしい。身勝手。