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は慣れてないので出てきてほしい。身勝手。
コメントをお書きください