Type.GetMethodで困っています
文字列クラス名よりDLLの関数を呼ぶプログラムを作っています。
問題は関数取得を行っているところです。
呼び出し側で、
Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam)
を行うとNothingが返ってきてしまいます。
原因はDLLのMain1の第2引数がByRefになっていることでした。
そこでByRefに対応するために、
Dim metDll As MethodInfo = typDll.GetMethod("Main1", BindingFlags.Public Or BindingFlags.Instance, Nothing, New Type() {System.Type.GetType("System.String"), System.Type.GetType("System.String&")}, Nothing))
にすると関数の取得ができました。
しかしこの場合、DLL側の関数パラメータ数分、型を定義しなくてはいけないし、オーバーライドしているMain関数すべてに対応できなくなってしまいます。そこで、
Dim typParam() As Type = Type.GetTypeArray(strParam)
の定義時にByRefにあたる部分に"System.String&"型を定義することはできないのでしょうか?
ご回答お願いします。
'****************************
'DLL側(test.dll)
'名前空間(test)
'****************************
Public Class DLL_TEST
Public Overridable Function Main1(ByVal Param1 As String, ByRef Param2 As String) As String
Param2 = "参照返し"
Return Param1
End Function
Public Overridable Function Main1(ByVal Param1 As String, ByVal Param2 As String, ByRef Param3 As String) As String
Param3 = "参照返し"
Return Param1 & ":" & Param2
End Function
'****************************
'呼び出し側
'****************************
Imports System
Imports System.Reflection
Public Class Form1
Inherits System.Windows.Forms.Form
・
・
・
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strParam() As String = {"C", "VB"}
'Dim strParam() As String = {"C", "VB", "J"}
Dim typParam() As Type = Type.GetTypeArray(strParam)
Dim asm As [Assembly] = [Assembly].LoadFrom("上記で作ったDLLの絶対パス")
Dim typDll As Type = asm.GetType("test.DLL_TEST")
Dim objDll As Object = Activator.CreateInstance(typDll)
Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam) 'ここで metDll が Nothing になってしまう
'下記だとmetDll にMethodInfo が返ってくる
'typDll.GetMethod("Main1", BindingFlags.Public Or BindingFlags.Instance, Nothing, New Type() {System.Type.GetType("System.String"), System.Type.GetType("System.String&")}, Nothing)
Dim Ret As String = metDll.Invoke(objDll, strParam)
If Ret = "C" And strParam(1).ToString = "参照返し" Then
MsgBox("成功")
End If
End Sub
お礼
ありがとうございました。 参考になりました。 ただ私の説明不足でした。 バイナリファイルの出力はすべてすでに出力されたもしか存在しないので次回に生かしたいと思います。