あるEXEファイルから、他のEXEファイルの中のフォームを強制的に表示するにはどうすれば出来るのかを調べてみました。
方法として、EXEファイルの中にあるアセンブリ名(フォーム名)を指定して型情報(Type)を取得し、 そのTypeを利用して Activator.CreateInstance メソッドでフォームのインスタンスが生成されます。
そのインスタンスが持っているフォームの表示メソッドを使えば、そのフォームの表示が行えます。
先ずは、呼び出されるフォーム側のソースです。こちらの方はEXE名を REF0002.EXE となる様に設定してます。 また、名前空間も同様に REF0002 としています。
呼び出される側のフォーム
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ソース
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") で可能です。
関連する記事
⇒他のEXEファイルにあるフォームを表示する方法その2(Activator.CreateInstanceの使い方)PR
コメント