あるEXEファイルから、他のEXEファイルの中のフォームを強制的に表示するにはどうすれば出来るのかを調べてみました。
方法として、EXEファイルの中にあるアセンブリ名(フォーム名)を指定して型情報(Type)を取得し、 そのTypeを利用して Activator.CreateInstance メソッドでフォームのインスタンスが生成されます。
そのインスタンスが持っているフォームの表示メソッドを使えば、そのフォームの表示が行えます。
先ずは、呼び出されるフォーム側のソースです。こちらの方はEXE名を REF0002.EXE となる様に設定してます。 また、名前空間も同様に REF0002 としています。
呼び出される側のフォーム
1 2 3 4 5 6 7 | Public Class Form1 Private Sub Button1_Click(sender As Object , e As EventArgs) Handles Button1.Click '自分を閉じる Me .Close() End Sub End Class |
上記のフォームが含まれる REF0002.EXE を呼出す側のソースは以下の通りです。
こちらの方は、特にフォームを持たずにMain() 関数からの実行となっています。
呼び出す側のMainソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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) 'フォームの ShowDialog メソッドを使用する frm.ShowDialog() End Sub End Module |
これを実行すると以下の様な表示になります。
ソースは特に難しいところは無いかと思います。 Form1のTypeを取得するところで asmExe.GetType("REF0002.Form1") としていますが、これは REF0002.EXE での名前空間を REF0002 に 設定してあるからです。 この名前空間を空白にすれば asmExe.GetType("Form1") で可能です。
コメント