私は、動的アンマネージドDLLの呼び出しを実行するために、いくつかの興味深いコードを使用しています:DLLでのメソッドの動的呼び出し。メソッドのシグネチャを変更するには?
Imports System.Runtime.InteropServices
Module NativeMethods
Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal dllToLoad As String) As IntPtr
Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As IntPtr, ByVal procedureName As String) As IntPtr
Declare Function FreeLibrary Lib "kernel32" (ByVal hModule As IntPtr) As Boolean
End Module
Module Program
<UnmanagedFunctionPointer(CallingConvention.Cdecl)> _
Delegate Function MultiplyByTen(ByVal numberToMultiply As Integer) As Integer
Sub Main()
Dim pDll As IntPtr = NativeMethods.LoadLibrary("MultiplyByTen.dll")
Dim pAddressOfFunctionToCall As IntPtr = NativeMethods.GetProcAddress(pDll, "MultiplyByTen")
Dim multiplyByTen As MultiplyByTen = DirectCast(Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, GetType(MultiplyByTen)), MultiplyByTen)
Dim theResult As Integer = multiplyByTen(10)
Console.WriteLine(theResult)
NativeMethods.FreeLibrary(pAddressOfFunctionToCall)
End Sub
End Module
私はvoidへのデリゲートのパラメータの署名と種類を変更することができるか、整数、文字列、またはブール値を返す関数になりたいです。
基本的には、自分のプログラム(インタプリタ)が、アンマネージdllのどのメソッドにでも呼び出せるようにしたいと思います。プログラマがアクセスしたいメソッドを予測できないからです。彼らがどんな有用な方法にもアクセスできるようにしたい。
これはvb.netで可能性があります - おそらく反射ありですか? - しかし、私はそれをやる方法が分かりません。
--- EDIT:その上で「= ...薄暗いtheResult」
<UnmanagedFunctionPointer(CallingConvention.Cdecl)> _
Delegate Function DelegateInteger(<[ParamArray]()> ByVal args() As Object) As Integer
...
Dim GetStdHandle = NativeDllCallIntegerMethod("kernel32", "GetStdHandle", -11)
...
Function NativeDllCallIntegerMethod(ByVal DllPath As String, ByVal DllMethod As String, ByVal ParamArray Arguments() As Object) As Integer
Dim pDll As IntPtr = NativeMethods.LoadLibrary(DllPath)
Dim pAddressOfFunctionToCall As IntPtr = NativeMethods.GetProcAddress(pDll, DllMethod)
Dim IntegerFunction As DelegateInteger = DirectCast(Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, GetType(DelegateInteger)), DelegateInteger)
Dim theResult As Object = IntegerFunction.DynamicInvoke(Arguments)
NativeDllCallIntegerMethod = theResult
NativeMethods.FreeLibrary(pAddressOfFunctionToCall)
End Function
これはとのライン上に苦情を提起する:ここで私が作ってみたものです。エラーは、 "型のオブジェクト 'System.Int32'は、 'System.Object []'の型に変換できません。"
どこかでが届いているようですが、どこですか?私は本当に知らない。
これで、ユーザーはメソッド名とシグネチャを指定し、プログラムが関数を呼び出すための適切なコードを自動的に生成できるようにする必要がありますか? – bobbymcr
はい。それが私が探していることです。 – Dominick
これは、最も一般的な場合(署名が使用できる場合)は容易ではありません。 ILが動的メソッド呼び出しを生成するために ".NETアセンブリコード"に相当するものをどのように生成するかを学ぶ必要があります。しかし、このプロジェクトは良い出発点かもしれません:http://dynamic.codeplex.com/ – bobbymcr