2017-10-27 1 views
-1

私は特定のプログラムで作業しています。別の拡張機能(保護されたdll、そのソースコードにアクセスしない)がそのウィンドウ内にいくつかのオブジェクト(テキスト、ラベルなど)を追加できる「メインウィンドウ」(a.k.a. "フォーム")を持っています。ウィンドウからすべてのオブジェクトを取得する方法(別のクラスから追加)

「フォーム」に追加されているすべてのオブジェクトにアクセスするにはどうすればよいですか?

典型的な拡張のここに私の例:私はすべての分類その他、匿名/アクセスできないから、-ed要素を「追加」にアクセスするために使用することができますどのようなコード

.... 
namespace ProgramName.Extensions { 

    public class MyExtensionName : ProgramName.ExtensionBase{ 

     //here goes typical codes to add things to "form" window,like: 
     Draw.Arrow(MainFormObject, ArrowColor, ArrowWidth) 

    } 

} 

?そこには、 "反射"または任意の解決策はありますか?

+0

は、 "フォーム" であることをどのように依存します。 WPFウィンドウまたはWinFormsフォームの場合は、その子について尋ねることができます。 – Evk

+0

に依存します。これは本当に空のライブラリの知識がなければ答えられません。彼らはキャンバスにオブジェクトを描いているだけですか?運が悪いですか?それとも彼らはどこかの参照を保持していますか?あなたはIlSpyのようなツールを使って、図書館を見て自分自身を理解することができます。 –

+0

関連するクラスに関する詳細情報が必要です。たとえば、Formクラスは何ですか?あなたはそれから派生し、AddXXXメソッドをオーバーライドできますか? –

答えて

1

あなたはこの

foreach (Control ctrl in this.Controls) 
{ 
    if (ctrl .GetType().GetProperty("Text") != null) 
    { 
     // code here    
    } 
} 
2

は、DLLを使用して、フォーム上のいくつかのオブジェクトを追加しようとすることができ、フォーム自体はその後追加

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
Form form = (Form)Activator.CreateInstance(type); 

何かlike:を使用してアクセスメンバーとして参照されている必要があります

form.Controls.Find(); 

現在のフォームの場合は、Load OD使用:DLLを保護

private void Form_Load(object sender, EventArgs e) 
    { 
     this.Controls.Find("name",true) 
     // OR 
     foreach(Control c in this.Controls) 
     if(c.Name == Name) 
      //Do something... 
    } 
1

、そのソースコード

  • にアクセスすることなくこれらのコントロールは、COM/OLE/ActiveXのように聞こえる:
  • あなたがそれらにアクセスすることができます限り、メインフォーム(ホストプログラム)が維持されているコードが見つかります。
  • プロジェクトコードでこれらのコントロールのキーワードを検索して、関連するコードを見つけることができます。
  • これらのDLLをプロジェクト参照に含めると、DLLからキーワードを調べる機会が得られます。
  • これらのDLLの使用方法を検索し、作業するコードの場所を見つけて、そこで作業します。 DLLのうち、キーワードを取得する方法

例:

enter image description here

関連する問題