- PR -

アセンブリでMDI子フォームを生成

投稿者投稿内容
エス
会議室デビュー日: 2007/06/29
投稿数: 5
投稿日時: 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を別途生成した場合、例外が発生するのは何故なのでしょうか?
また、問題を回避することは可能でしょうか?

ご教授頂けると幸いです。宜しくお願い致します。

ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-06-29 17:39
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1798140&SiteID=7
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-06-29 20:53
AppDomain をまたいでオブジェクトをやり取りする場合、
シリアライズ可能とするか、マーシャリング可能とする必要があります。
.NET Remoting と同じですね。

メインドメイン内で Assembly.LoadFrom によって生成した場合はドメインをまたいでいるわけではありませんので、この制限はかかりません。

[ メッセージ編集済み 編集者: masa 編集日時 2007-06-29 20:56 ]
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-06-29 21:38
私も以前に似たようなことを調べていました。

当時の検証コードに目を通してみましたが、
MDIとしての利用ではなく、ダイアログを表示させて戻り値を取得するようなものでした。プラグインに相当するクラスを定義してそれをメインドメインから利用するイメージです。

別ドメインで生成したユーザーコントロールをメインドメインのフォームに格納できないか、といったことも調べていた記憶はあるのですが、該当するコードはありませんでした。同じように "ControlCollection" で躓いたような・・・。

エス
会議室デビュー日: 2007/06/29
投稿数: 5
投稿日時: 2007-07-02 07:53
ぶさいくろうさん、masaさん、有難う御座います。
また、返信遅れまして申し訳ありません。

.NET Remoting について調べてみます。

また何かありましたら宜しくお願い致します。
エス
会議室デビュー日: 2007/06/29
投稿数: 5
投稿日時: 2007-07-02 14:19
申し訳ありません。
再度、質問させてい頂きます。

.NET Remoting を調べていて気になった点があります。
アセンブリ化するクラスは、System.MarshalByRefObjectを継承する必要があるらしいのですが、各アセンブリはFormクラスを継承しています。
C#での多重継承は不可能ですので、どのようにすれば良いのか想像ができません。
ご教授の程、宜しくお願い致します。

※ 的外れな質問をしていましたら申し訳ありません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-02 15:27
引用:

エスさんの書き込み (2007-07-02 14:19) より:

アセンブリ化するクラスは、System.MarshalByRefObjectを継承する必要があるらしいのですが、各アセンブリはFormクラスを継承しています。


System.Windows.Forms.Form クラスの継承階層がどのようになっているのかご存知でしょうか?ご参考までにリファレンスのリンクをおいておきます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-07-02 16:00
引用:

masaさんの書き込み (2007-06-29 21:38) より:

別ドメインで生成したユーザーコントロールをメインドメインのフォームに格納できないか、といったことも調べていた記憶はあるのですが、該当するコードはありませんでした。同じように "ControlCollection" で躓いたような・・・。




私も検証を途中で終えていて確実なことは言えないのですが、
リモーティングを跨いだときにはプロキシとして取得されることになります。
あるコントロールをフォームに配置すると、

・フォームの Controls に追加される
・コントロールの Parent にフォームが登録される

のですが、
プロキシであるコントロールの Parent プロパティにはうまく設定できませんでした。
そのときの例外などについては覚えていませんが、
マーシャリング・シリアライズに関するものだったと思います。
MDIも大きな意味ではコントロールをフォームに関連付ける操作となりますので、
きっと原因は同じだと思います。


そして、もしリモート経由でうまく設定できたとしても、
何か操作が行われるたびにリモート間通信が発生しそうな気もします。



p.s. 解決したらぜひ教えてください。





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