気になった事を自由に書いてます。
      
アプリケーションドメインの罠からの脱却。
昨日の残念な結果からブルーな気持ちが抜けきれないまま、
どうにかしてアプリケーションドメインを使えないものか調べていました。

試行錯誤の結果、別アプリケーションドメインからでもずれずに表示できる方法を見つけました。
なぜか大丈夫なのかという理由は分からないので心配ですが・・・
まずは昨日のソースはこんな感じです。

テストコード
1
2
3
4
5
6
7
System.Runtime.Remoting.ObjectHandle handle = null;

System.AppDomain ad = System.AppDomain.CreateDomain("Topic03");
handle = ad.CreateInstance("partA", "partA.Form1");

Form form = handle.Unwrap() as Form;
form.ShowDialog()

3行目で別アプリケーションドメインを作成しています。"Topic03"はドメインの表示名です。
4行目は「アセンブリ名」と「空間名+クラス名」を指定し、partA.exeのForm1のインスタンスを生成し
handleに格納しています。
ad.CreateInstanceでインスタンスを生成しているので、このフォーム情報は別アプリケーションドメインで管理されます。
6行目はFormクラスにキャストしています。7行目で表示です。
これでボタンの文言やラベルがずれて表示される問題が勃発するのです。



修正したソースがこちら

テストコード
1
2
System.AppDomain ad = System.AppDomain.CreateDomain("Topic03");
ad.ExecuteAssembly("partA.exe");

超シンプルです。別アプリケーションドメインにアセンブリをロードするだけです。
これでOKです。ただExecuteAssemblyで呼び出された画面はモードレスです。
モーダルで呼びたい場合は、こんな感じでやればできました。

テストコード
1
2
3
4
5
6
7
8
System.Runtime.Remoting.ObjectHandle handle = null;

System.AppDomain ad = System.AppDomain.CreateDomain("Topic03");
ad.ExecuteAssembly("partA.exe");
handle = ad.CreateInstance("partA", "partA.Form1");

Form form = handle.Unwrap() as Form;
form.ShowDialog();

このサンプルのままでは4行目と8行目で2回画面が表示されるので、
partAのprogram.csをいじって画面を表示させない工夫が必要となります。
      





Copyright (C) 2011 - 2015 猫の気ままなC#日記