- PR -

親画面(EXE)と子画面(DLL)の作成

投稿者投稿内容
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2003-08-19 08:44
引用:

Jittaさんの書き込み (2003-08-19 08:09) より:
おもしろい話題なので、結果は教えてくださいね?



分かりました。
成功した暁には、ご報告いたします。
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2003-08-20 09:36
お世話になります。

meiさんの力を借りて、無事に親画面と子画面のやりとりを
することができました。(…最初の一歩ですが(^^

一応、成功したソースを展開します。
# すべてmeiさんによるコードです。
# (す、すいません。meiさんm(_ _)m)
# 余計な宣言などは、全て省いてあります。

コード:
////////////////////////////////////////////////
///
/// Main.exe(親画面)
///
#using <ISub.dll>
namespace MySample
{
	public __gc class Form1 : public Form
	{	
	public:
		Form1(void)
		{
			InitializeComponent(); // フォームを作成(省略)
		}
	private: PictureBox *  pictureBox1;

	private: Void Form1_Load(Object *  sender, EventArgs *  e)
		 {
			 // 例なので"Sub1.dll"固定
			 String* path1 = String::Format("{0}\\..\\Debug\\Sub1.dll", 
				 System::Environment::CurrentDirectory);
			 Assembly *a = Assembly::LoadFrom(path1);
			 ISub* sub = dynamic_cast<ISub*>(a->CreateInstance("MySample.Sub"));
			 sub->Build(pictureBox1);
		 }
	};
}

////////////////////////////////////////////////
///
/// ISub.dll
///
namespace MySample
{
	public __gc __interface ISub
	{
		void Build(PictureBox* pb);
	};
}

////////////////////////////////////////////////
///
/// Sub1.dll(子画面1)
///
#using <ISub.dll>
namespace MySample
{
	public __gc class Sub : public ISub
	{
	public:
		void Build(PictureBox* pb) {
			Button* b = new Button();
			b->Location = Point(0, 0);
			b->Text = S"ボタン";
			pb->Controls->Add(b);
		}
	};
}


それと、
Main.exeとSub1.dllのプロジェクトのプロパティページで、
[#using 参照の解決]に作成された"ISub.dll"を参照できるように指定しました。


こんな感じでできました。

まだまだ始まったばかりなので、
問題が出てくると思います。
そのときは、また質問させてもらいます。
宜しくお願い致します。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-20 10:05
引用:

優希さんの書き込み (2003-08-20 09:36) より:

// 例なので"Sub1.dll"固定
String* path1 = String::Format("{0}\..\Debug\Sub1.dll",
System::Environment::CurrentDirectory);


 例ですが…これだと「実行しているアセンブリのカレントディレクトリからの相対パス」なので、「実行しているアセンブリがあるディレクトリからの相対パス」にする方がいいですね。「カレントディレクトリ」は、OpenFileDialogやSaveFileDialogを使うと、変更される場合があります。

 「実行しているアセンブリがあるディレクトリ」も、アセンブリキャッシュを指していたりする場合があって、なかなか使いづらいかもしれませんが^^;

 プラグイン用のディレクトリを作って、そこへのパスをどこかで設定させる方がベター?
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-08-20 12:09
こんにちは、meiです。

引用:

Jittaさんの書き込み (2003-08-20 10:05) より:
 「実行しているアセンブリがあるディレクトリ」も、アセンブリキャッシュを指していたりする場合があって、なかなか使いづらいかもしれませんが^^;

 プラグイン用のディレクトリを作って、そこへのパスをどこかで設定させる方がベター?


サンプルとは言え、ちょっと手抜きでした(汗)。

.NETらしく構成ファイル(モジュール名+.config)で設定するのが良いかも。

Main.exe.configの例
コード:
<?xml version="1.0" ?>
<configuration>
		<appSettings>
				<add key="Plugin" value="Plugin/Sub1.dll" />
				<add key="TypeName" value="MySample.Sub" />
		</appSettings>
</configuration>



で、使い方。
コード:
// モジュールのフルパスを取得
String* exe = Assembly::GetEntryAssembly()->Location;
// 使用するプラグインを取得(モジュールパスからの相対位置)
String* plugin = ConfigurationSettings::AppSettings->Get("Plugin");
// 読み込むタイプ名
String* typeName = ConfigurationSettings::AppSettings->Get("TypeName");
// 読み込むプラグインのフルパスを作成
String* path = Path::Combine(Path::GetDirectoryName(exe), plugin);

Assembly* a = Assembly::LoadFrom(path);
ISub* sub = dynamic_cast<ISub*>(a->CreateInstance(typeName));
sub->Build(pictureBox1);



って感じかしら。

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