2

仕事で開発しているソフトウェアに問題があります。ユーザーが次の手順を実行した後、dll ファイルを作成しています。

  1. 特定のパラメータと計算コードを win フォームに指定します。
  2. dll の名前を指定します。

これが完了したら、(codeDOM を使用して) 必要なすべてのコード ファイルを作成し、ソース ファイルをコンパイルして dll を生成します。

さて、私の問題はUIにあります。UI の dll のオブジェクト内にパラメーターを表示したいのですが、ユーザーが追加しようとしているパラメーターがわかりません。

UI要素(事前に知っている)とdll内のオブジェクト(リフレクションを使用して収集できる情報を除いて、事前の知識がない)を結合する構成ファイルを指定できるシステムが必要です) .

したがって、実質的には、UI 要素 (label.text など) 間の結合をコードの外部とおそらく xml ファイルに持ち込みたいと考えており、UI はこの xml ファイルを使用して、動的にロードされたオブジェクト内のオブジェクトからデータを入力する必要があります。 dll.

助けてください。

前もって感謝します。

4

2 に答える 2

1

Here is a short code snippet to get you started:

Assembly asm = Assembly.LoadFrom("generated_asm.dll");
// or if the assembly is already loaded:
// asm = AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "Generated.Assembly");

var type = asm.GetType("InsertNamespaceHere.InsertTypeNameHere");

// creates a table layout which you can add to a form (preferable you use the designer to create this)
var tbl = new TableLayoutPanel { ColumnCount = 2 };

// enumerate the public properties of the type
foreach(var property in type.GetProperties())
{
  tbl.Add(new Label(property.Name));

  var input = new TextBox { Tag = property };
  input.TextChanged = this.HandleTextChanged;
  input.Enabled = property.CanWrite;

  tbl.Add(input);
}

and in the handler you could use this:

void HandleTextChanged(object source, ...) {
  var input = source as TextBox;
  var property = input.Tag as PropertyInfo;
  property.GetSetMethod().Invoke(this.instanceOfThatType, new object[] { Convert.ChangeType(input.Text, property.PropertyType) });
}

Hope this helps :)

于 2012-11-22T01:36:48.087 に答える
0

PrismまたはMEF (Managed Extensibility Framework)を見たいと思うかもしれません。あなたが説明している種類の遅延バインディングは間違いなくサポートされています。実際、これは私たちが仕事で使用しているテクノロジー スタックであり、アセンブリで遅延バインディング (多かれ少なかれプラグイン アーキテクチャに似ています) を行います。

于 2012-11-22T04:04:48.833 に答える