あるEXEファイルから、他のEXEファイルの中のフォームを強制的に表示する方法として以下の記事で説明しましたが、
⇒他のEXEファイルにあるフォームを表示する方法(Activator.CreateInstanceの使い方)
この方法ではフォームを表示するだけで、面白味が在りませんので、今回はフォームにプロパティとメソッドを追加して それらに対するアクセス方法を説明します。
先ずは、フォームにテキストボックスを1個追加し、それに対して値を設定したり取得するプロパティと、 テキストボックスの内容を表示するメソッドを追加します。
呼び出される側のフォーム
Public Class Form1
Private mstrParamData As String
'テキストボックスに値を設定するプロパティ
Public WriteOnly Property SetParamData As String
Set(value As String)
Me.TextBox1.Text = value
End Set
End Property
'テキストボックスの内容を取得するプロパティ
Public ReadOnly Property GetTextData As String
Get
Return Me.TextBox1.Text
End Get
End Property
'外部からアクセス可能なメソッド
Public Sub DspTextBox()
MessageBox.Show("TextBox1.Text : " & Me.TextBox1.Text)
End Sub
'ボタンクリックイベント
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'自分を閉じる
Me.Close()
End Sub
End Class
上記のフォームが含まれる REF0002.EXE を呼出す側のソースは以下の通りです。
こちらの方は、特にフォームを持たずにMain() 関数からの実行となっています。
呼び出す側のMainソース
Public Module Main
Sub Main()
'自分自身の実行ファイルのパスを取得する
Dim appPath As String = _
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
'アセンブリ"REF0002.exe"を読み込む(「REF0002.EXE」は「REF0001.EXE」が存在するフォルダに在ります)
Dim asmExe As System.Reflection.Assembly = _
System.Reflection.Assembly.LoadFile(appPath & "\REF0002.exe")
'Form1のTypeを取得する(名前空間を指定しているのでフォーム名の前に名前空間を付加)
Dim typForm As Type = asmExe.GetType("REF0002.Form1")
'フォーム作成用変数
Dim frm As Form
'フォームのインスタンスを作成
Dim obj As Object = Activator.CreateInstance(typForm)
'インスタンスをフォームとして扱う
frm = DirectCast(obj, Form)
'プロパティの設定
Dim pinf As System.Reflection.PropertyInfo = typForm.GetProperty("SetParamData")
pinf.SetValue(frm, "Set From REF0001", Nothing)
'フォームの ShowDialog メソッドを使用する
frm.ShowDialog()
'プロパティの取得
pinf = typForm.GetProperty("GetTextData")
Dim str As String = CStr(pinf.GetValue(frm, Nothing))
MessageBox.Show(str)
'メソッドの利用
Dim minf As System.Reflection.MethodInfo = typForm.GetMethod("DspTextBox")
minf.Invoke(frm, Nothing)
End Sub
End Module
プロパティの情報(System.Reflection.PropertyInfo)を取得する為に、Typeの GetProperty メソッドを使います。 その PropertyInfo の SetValue メソッドでプロパティへの値を設定します。
また、 PropertyInfo の GetValue メソッドでプロパティの値の取得を行います。
さらにメソッドの実行は、プロパティと同様にTypeの GetMethod メソッドによりメソッド情報(System.Reflection.MethodInfo)を取得し PropertyInfo の Invoke メソッドで該当するメソッドの実行を行います。
これを実行すると以下の様な表示になります。
コメント