- PR -

アプリケーションドメイン間の通信について

1
投稿者投稿内容
DT
会議室デビュー日: 2002/08/02
投稿数: 2
投稿日時: 2004-08-17 18:03
VS2003、VB.NETで業務システムを開発しています。

画面(フォーム)が300以上ありまして、それをリフレクションで読み込んで実行しています。リフレクションデータはDBに格納しています。

この方法だと、全画面起動(DLLを読込)しただけで、メモリ消費量が膨大になってしまうため、解決策を模索しています。

アセンブリをアンロードするために、アプリケーションドメインを分ける事を、考えていますが、そうすると、アプリケーションドメイン間の通信が必要となってしまいます。実行環境にMetaFrameを用いていますので、リモートでの処理はあきらめています。

中立アプリケーションドメインという物を耳にして利用できないかと考えているのですが、仕様もはっきりと理解できていない状態なので、使いこなせていません。
詳しい情報をお持ちの方がいらっしゃれば、ご教授願いたく思います。

中立アプリケーションドメイン以外でも、何か良い方法があればお教え下さい。

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-08-17 22:58
諸農です。

私自身、Domainについては余りよく判っていませんので、
とりあえず情報だけです。

「プログラミング Microsoft .NET Framework」
と言う書籍の後半部分に詳しく解説がされていました。
もしよければ参考にしてください。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-08-17 23:01
こんばんは、meiです。

引用:

DTさんの書き込み (2004-08-17 18:03) より:
VS2003、VB.NETで業務システムを開発しています。

アセンブリをアンロードするために、アプリケーションドメインを分ける事を、考えていますが、そうすると、アプリケーションドメイン間の通信が必要となってしまいます。実行環境にMetaFrameを用いていますので、リモートでの処理はあきらめています。



個々のフォームに対する独自の操作が無ければ、別ドメインを用意して、そこにアセンブリを読み込んでインタフェースやベースクラス経由でアクセスすることになると思います。(この例だとFormクラスかな?)

以前、テストに使ったソースを参考までに貼り付けます。C#で済みません。
コード:

using System;

public class MyApp {
public static void Main() {
for (int i = 0; i < 10; ++i) {
Console.WriteLine("load Calc.dll to AppDomain.");
Console.ReadLine();
// Calc.dllをロードするためにAppDomainを作成
AppDomain sub = AppDomain.CreateDomain("sub", null);

// Calc.dllをロード
ICalc calc = sub.CreateInstanceAndUnwrap("Calc", "Calc") as ICalc;
Console.WriteLine(calc.Add(i, i));

Console.WriteLine("unload Calc.dll from AppDomain.");
Console.ReadLine();

// AppDomainをアンロード(Calc.dllもアンロード)
AppDomain.Unload(sub);
}
}
}


アセンブリがアンロードされるかどうかのテストだったので、ループを回したり、ReadLine()が入っていたりしています。上記ソースのCalcが読み込みたいアセンブリとクラス名です。また、アンロードするためにはCalcという具体的なクラス名を使うわけにはいかないので、ICalcというインタフェースを経由させています。DTさんの例だと、Calcの代わりに各画面(フォーム)を生成するので、ICalcではなくForm経由でアクセスすることになると思います。(各画面はFormから継承していますよね?)

アセンブリはドメイン単位でしかアンロード出来ないので、ちょっと面倒ですよね。

あと、別ドメインで生成したオブジェクトへのアクセスは遅いので、頻繁に呼び出す(ループ内とか)ようなクラスを別ドメインに生成する場合は注意してください。

# GotDotNet Japanの方で色々レスがついているみたいですね。

[ メッセージ編集済み 編集者: mei 編集日時 2004-08-17 23:16 ]
1

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