ある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 メソッドで該当するメソッドの実行を行います。
これを実行すると以下の様な表示になります。
コメント