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