うちのカレーにはこれが入ってる!って食材ありますか?

文字列クラス名より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

A 回答 (1件)

以下のように呼び出し側を変更するとうまくいくようです。


-------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myObj As Object() = New Object() {"C", "VB", "J"}
Dim typParam As Type() = {Type.GetType("System.String"), Type.GetType("System.String"), Type.GetType("System.String&")}

Dim asm As [Assembly] = [Assembly].LoadFrom("ByRef_Test.dll")
Dim typDll As Type = asm.GetType("ByRef_Test.test.DLL_TEST")
Dim objDll As Object = Activator.CreateInstance(typDll)
Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam)
Dim Ret As String = metDll.Invoke(objDll, myObj)
If myObj(2).ToString = "参照返し" Then
MsgBox("成功")
End If
End Sub

-------------------------------------------------------
    • good
    • 0
この回答へのお礼

Type() 思いつきませんでした
どうもーです

お礼日時:2007/06/12 00:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報