- PR -

System.Reflection.Assemblyについて

1
投稿者投稿内容
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2005-11-18 12:58
お世話になってます。

皆様のお力を拝借したく書き込みました。
何でも結構です。ご助言いただけると幸い
です。
長文になりますがご容赦下さい。


C#でWinアプリを作りました。
app1.exeとします。

app1.exeはコマンドライン引数を受け取ってフォー
ム上に表示するだけとします。

app1.exe /A "hoge 1" /B "hoge 2"

↑このように実行されると、app1.exeはフォー
ム上のラベルAに"hoge 1"、ラベルBに"hoge 2"
と表示します。

もう一つC#でWinアプリを作成しました。
app2.exeとします。MDIです。

app2.exeは、子ウィンドウとしてapp1.exeを
複数表示します。
app2.exeでSystem.Reflection.Assemblyを使っ
て下記のように子ウィンドウを作成しています。

-------------------------------------------------
System.Reflection.Assembly ass = null;
ass = System.Reflection.Assembly.LoadFrom("app1.exe");
Form childFrm = (Form)ass.CreateInstance("formMain"); // ※
childFrm.MdiParent = this;
childFrm.Show();
-------------------------------------------------
※formMainはapp1.exeフォームのクラス名

このように作成された子ウィンドウ(app1.exe)
にコマンドライン引数を渡す事でラベルAとラベ
ルBの文字列を動的に変更させたいと思っている
のですが、Assemblyオブジェクトに対してコマン
ドライン引数を設定する方法が分かりません。


ご存知の方いらっしゃいましたらご教授いただ
けますでしょうか。
要点は下記です。
・MDI子ウィンドウとしてapp1.exeを複数表示する必要がある
・app1.exeには手をいれられない
・app1.exeにコマンドライン引数を渡したい
System.Reflection.Assembly以外の方法等もあ
りましたらアイデアをいただけると嬉しいです。

よろしくお願いします。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2005-11-18 13:13
Process.Start
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-18 13:37
LoadFrom メソッドはアセンブリを読みに行くだけですので、
実行時に受け取ることができるコマンドラインを渡すことはできません。

引用:

app1.exeには手をいれられない


悩ましいところですね。
エントリ ポイントでも呼び出して実行してみますか? (w

コード:

    private static void OneMethod() {
        System.Reflection.Assembly hAssembly = System.Reflection.Assembly.LoadFrom("app1.exe");
        Type hType = hAssembly.GetType("app1.Form1");
        object hForm1 = hType.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, null);
        hType.InvokeMember("Main", System.Reflection.BindingFlags.InvokeMethod, null, hForm1, new object[] {new string[] {"/A", "\"hoge 1\"", "/B", "\"hoge 2\""}});
    }


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-11-18 13:41
引用:

エントリ ポイントでも呼び出して実行してみますか? (w


これはapp1のエントリポイントに記述されてるであろうApplication.Runが実行されてしまって不味いんでは。

app1の仕様によるところが大きいですが、app1の実装にべったりな記述をせざるを得ないと思いますねー。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-18 13:57
引用:

Hongliangさんの書き込み (2005-11-18 13:41) より:

これはapp1のエントリポイントに記述されてるであろうApplication.Runが実行されてしまって不味いんでは。


はい、かなりまずいですw

引用:

app1の仕様によるところが大きいですが、app1の実装にべったりな記述をせざるを得ないと思いますねー。


うーん...w

コード:

private static void OneMethod() {
System.Reflection.Assembly hAssembly = System.Reflection.Assembly.LoadFrom("app1.exe");
Type hType = hAssembly.GetType("app1.Form1");
object hForm1 = hType.InvokeMember(null, System.Reflection.BindingFlags.CreateInstance, null, null, null);

// たとえば、textBox1 に値を仕込む (非パブリックメンバ OK)
object hTextBox = hType.InvokeMember(
"textBox1",
System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic,
null,
hForm1,
null
);

if (hTextBox is TextBox) {
((TextBox)hTextBox).Text = "リフレクション嫌い...";
}

((Form)hForm1).Show();
}



[ シグネチャを削除 ]

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2006-10-12 11:23 ]
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2005-11-18 14:34
皆様、早速のお返事ありがとうございます。

Process.Startについてですが、別プロセスの
メインウィンドウオブジェクトを取得してMdiParent
を設定するといったことができるかですね。
ちょっと調べてみます。
cats様、ありがとうございました。

InvokeMemberでapp1のメンバを取得して直接設定して
しまう方法についてですが。。。
一回目のInvokeMemberでエラーが発生してしまいます。
'System.Reflection.TargetInvocationException' のハンドルされていない例外が mscorlib.dll で発生しました。
ただ、方向的にはこれしかないのかなと思い始めてます。
とりあえず動くようにして検討してみます。
じゃんぬねっと様・Hongliang様、ありがとうございま
した。

引き続き、アイデア・情報等のご提供をいただけると幸
いです。
宜しくお願いします。
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2005-11-18 14:58
自己レスです。

ちょっと方向性を変えて考えています。

System.Environment.GetCommandLineArgs()
で取得できるコマンドライン引数を上書きす
るような事はできないかと考えています。

app2.exeはFormLoadイベント内で
GetCommandLineArgs()
を実行してコマンドライン引数を取得・利用
しています。

なので、子ウィンドウ生成前にコマンドラ
イン引数を上書きできれば全て問題解決かと
考えました。

GetCommandLineArgs()で取得できる値を上書き
するような事は可能でしょうか?
方法がちょっと見当たりません。ご教授いただ
けますでしょうか。
宜しくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-18 15:19
引用:

@TKさんの書き込み (2005-11-18 14:34) より:

一回目のInvokeMemberでエラーが発生してしまいます。
'System.Reflection.TargetInvocationException' のハンドルされていない例外がmscorlib.dll で発生しました。


その app1.exe にある Form1 のコンストラクタで何やら良からぬ事をやっているのでしょうか?
たとえば、コマンドライン引数があることを前提にしてコーディングされているとか...
(ない場合の対応ができていないプログラムを、最近見て恐怖を感じましたが)

というより手元にソースがないので、

引用:

・app1.exeには手をいれられない


と仰ってるんでしょうか?
かなり絶望的ですね... (^-^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)