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
お礼
言葉足らずで申し訳ございません。 Dim myPath As String = System.Reflection.Assembly.GetExecutingAssembly().Location Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(myPath) Dim t As Type = asm.GetType("YoushikiPrint.ClsF_" & PrtNoABC) 確認した所2行目の変数asmには バッチリ指定したコンパイル中のexeのアセンブリが表示されております。 エラーになっているのは変数tが nothingを返しエラーになっている状況です。 変数prtNOABCは事前のロジックで prtNOABC=100 となっていますので Dim t As Type = asm.GetType("YoushikiPrint.ClsF_100")となります。 今、制作中のソフト内には Cls_YoushikiPrint、ClsF_100、ClsF_110、ClsF_120 というフォームが用意されており Cls_YoushikiPrintというフォームに配置してあるボタンを押した際 Dim myPath As String = System.Reflection.Assembly.GetExecutingAssembly().Location Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(myPath) Dim t As Type = asm.GetType("YoushikiPrint.ClsF_" & PrtNoABC) が動き変数tにフォームがあった場合は 値を返したいのでございます。 皆様…ご教示宜しくお願い致します。