• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#のforeachに苦しめられてます。)

C#のforeachで複数DLLの情報を集める際に発生する問題と解決方法

このQ&Aのポイント
  • C#のforeachを使って複数のDLLの情報を一つのコレクションに集める際に、次のコレクションに移ると最初のコレクションの情報が上書きされてしまうという問題が発生しています。
  • さらに、画像をクリックした際に作成されるボタンの削除がうまくいかず、textBoxだけが削除されて作り直されてしまうという問題もあります。
  • さらにさらに、どちらのボタンを押してもtextBoxにはDLL2が入力されてしまいます。この問題の解決策についても考えています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

うーん、具体的なロジックが不明なので何とも言えませんが、 DirectoryCatalog()で指定してたディレクトリに入っているDLLが古かったりしませんか? DLLをコンパイルしているだけで、DirectoryCatalog()のディレクトリ内にコピーし忘れてるとか。 関数();は、PictureBox1がクリックされた際に実行されるものであると思われますが、 そのDLL内部の関数()内で、『クリックしたときのイベント』というのがあるのも不可解ですが、 前回の流れ的に、ボタンをクリックした時のイベントでしょうかね?? テキトーに作成したところ、問題なく動きますので、コピー忘れなどの安直なミスだと 思うんですが・・・。 【I/F】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace MefIf { public interface MefIf { string picturebox1url(); void viewControls(Control c); } } 【AddIn1】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.ComponentModel.Composition; using MefIf; namespace Mef1 { [Export(typeof(MefIf.MefIf))] public class Mef1 : MefIf.MefIf { public string picturebox1url() { return @"C:\1.png"; } TextBox t = null; Button b = null; public void viewControls(Control c) { if (t != null) { c.Controls.Remove(t); } if (b != null) { c.Controls.Remove(b); } t = new TextBox(); t.Left = 100; t.Width = 100; t.Top = 100; t.Height = 20; c.Controls.Add(t); b = new Button(); b.Left = 100; b.Width = 100; b.Top = 130; b.Height = 20; b.Text = "Click!"; c.Controls.Add(b); b.Click += (s, e) => { t.Text = "DLL1"; }; } } } 【AddIn2】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.ComponentModel.Composition; using MefIf; namespace Mef2 { [Export(typeof(MefIf.MefIf))] public class Mef2 : MefIf.MefIf { public string picturebox1url() { return @"C:\2.png"; } TextBox t = null; Button b = null; public void viewControls(Control c) { if (t != null) { c.Controls.Remove(t); } if (b != null) { c.Controls.Remove(b); } t = new TextBox(); t.Left = 200; t.Width = 100; t.Top = 100; t.Height = 20; c.Controls.Add(t); b = new Button(); b.Left = 200; b.Width = 100; b.Top = 130; b.Height = 20; b.Text = "Click!"; c.Controls.Add(b); b.Click += (s, e) => { t.Text = "DLL2"; }; } } } 【Form】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using MefIf; namespace WindowsFormsApplication2 { public partial class Form1 : Form { private DirectoryCatalog catalog; private CompositionContainer container; [ImportMany] private List<MefIf.MefIf> addins; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { catalog = new DirectoryCatalog("plugins"); container = new CompositionContainer(catalog); container.ComposeParts(this); } private void button1_Click(object sender, EventArgs e) { foreach (var addin in addins) { var PictureBox1 = new PictureBox(); if (addin.ToString() == "Mef1.Mef1") { PictureBox1.Left = 10; PictureBox1.Width = 100; PictureBox1.Top = 10; PictureBox1.Height = 80; } else { PictureBox1.Left = 200; PictureBox1.Width = 100; PictureBox1.Top = 10; PictureBox1.Height = 80; } PictureBox1.ImageLocation = addin.picturebox1url(); PictureBox1.Click += (s, ex) => { addin.viewControls(this); }; this.Controls.Add(PictureBox1); } } } }

satisfied999
質問者

お礼

ありがとうございます。なんとかなりました☆ 感謝です。

satisfied999
質問者

補足

返信ありがとうございます。 私が作成したツールをアップロードしてみました http://1drv.ms/1nXI0l1 また、 状況の動画を作成してみました。 http://youtu.be/LMcpGo3OWPE 書いていただいたソースはまだ試していないので後ほど試してみたいと思います。

その他の回答 (1)

回答No.1

どちらもDLL2.dll内の関数()が呼び出されているということはありませんか? foreach()回している変数eの内容がよくわからないのと、関数()をどのように呼び出しているのでしょうか?

satisfied999
質問者

補足

eにはMEFを使ってDLLの内容をコンテナに入れています。 >>どちらもDLL2.dll内の関数()が呼び出されているということはありませんか? PictureBox1で表示される画像の指定アドレスもDLLからよびだしていますので、同じものが読み込まれているということはないです。 foreach (var e in dll) { var PictureBox1 = new PictureBox(); PictureBox1.ImageLocation = e.picturebox1url();// PictureBox1.Click += (s, e) => { このような形です。 関数もMEFをつかって、DLL⇒インターフェイス⇒メインというかたちで呼び出しています。

関連するQ&A