- - PR -
アセンブリでMDI子フォームを生成
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-29 17:17
VS2005のC# .NETにてWindowsアプリを開発しています。
数100種の子フォームを表示するMDIアプリを開発しています。 各種フォームを個々にアセンブリ化し、MDIアプリから指定したフォームのアセンブリをロードします。 各種フォームを閉じた際に、アセンブリをアンロードしたく、AppDomainを別途生成しています。 各種フォームのクラスはFormクラスを継承しています。 CreateInstanceAndUnwrapにて生成したインスタンスのMdiParentに、MDIアプリのフォームを指定すると、例外が発生します。 「System.Windows.Forms.MdiClient+ControlCollectionはシリアル化可能に設定されていません」という内容です。 Assembly.LoadFromとCreateInstanceにて生成した場合は、問題なくMdiParentに設定でき、正常に動作しました。 AppDomainを別途生成した場合、例外が発生するのは何故なのでしょうか? また、問題を回避することは可能でしょうか? ご教授頂けると幸いです。宜しくお願い致します。 | ||||
|
投稿日時: 2007-06-29 17:39
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1798140&SiteID=7
| ||||
|
投稿日時: 2007-06-29 20:53
AppDomain をまたいでオブジェクトをやり取りする場合、
シリアライズ可能とするか、マーシャリング可能とする必要があります。 .NET Remoting と同じですね。 メインドメイン内で Assembly.LoadFrom によって生成した場合はドメインをまたいでいるわけではありませんので、この制限はかかりません。 [ メッセージ編集済み 編集者: masa 編集日時 2007-06-29 20:56 ] | ||||
|
投稿日時: 2007-06-29 21:38
私も以前に似たようなことを調べていました。
当時の検証コードに目を通してみましたが、 MDIとしての利用ではなく、ダイアログを表示させて戻り値を取得するようなものでした。プラグインに相当するクラスを定義してそれをメインドメインから利用するイメージです。 別ドメインで生成したユーザーコントロールをメインドメインのフォームに格納できないか、といったことも調べていた記憶はあるのですが、該当するコードはありませんでした。同じように "ControlCollection" で躓いたような・・・。 | ||||
|
投稿日時: 2007-07-02 07:53
ぶさいくろうさん、masaさん、有難う御座います。
また、返信遅れまして申し訳ありません。 .NET Remoting について調べてみます。 また何かありましたら宜しくお願い致します。 | ||||
|
投稿日時: 2007-07-02 14:19
申し訳ありません。
再度、質問させてい頂きます。 .NET Remoting を調べていて気になった点があります。 アセンブリ化するクラスは、System.MarshalByRefObjectを継承する必要があるらしいのですが、各アセンブリはFormクラスを継承しています。 C#での多重継承は不可能ですので、どのようにすれば良いのか想像ができません。 ご教授の程、宜しくお願い致します。 ※ 的外れな質問をしていましたら申し訳ありません。 | ||||
|
投稿日時: 2007-07-02 15:27
System.Windows.Forms.Form クラスの継承階層がどのようになっているのかご存知でしょうか?
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-07-02 16:00
私も検証を途中で終えていて確実なことは言えないのですが、 リモーティングを跨いだときにはプロキシとして取得されることになります。 あるコントロールをフォームに配置すると、 ・フォームの Controls に追加される ・コントロールの Parent にフォームが登録される のですが、 プロキシであるコントロールの Parent プロパティにはうまく設定できませんでした。 そのときの例外などについては覚えていませんが、 マーシャリング・シリアライズに関するものだったと思います。 MDIも大きな意味ではコントロールをフォームに関連付ける操作となりますので、 きっと原因は同じだと思います。 そして、もしリモート経由でうまく設定できたとしても、 何か操作が行われるたびにリモート間通信が発生しそうな気もします。 p.s. 解決したらぜひ教えてください。 |