5

私は現在、ソースコードを書かずに「プログラム」を作成できるアプリケーションを開発しています。必要に応じて、クリックして再生するだけです。

ここでの問題は、データ モデルから実行可能プログラムをどのように生成するかです。多くの可能性がありますが、どれが私に最適かはわかりません。クラスと名前空間、およびアプリケーションの一部になる可能性のあるすべてのものを含むアセンブリを生成する必要があります。

  1. CodeDOM クラス: このクラスには多くの制限とバグがあると聞きました。メソッドのパラメーターと戻り値に属性を作成する必要があります。これはサポートされていますか?

  2. プログラムで C# ソース コードを作成し、それに対して CompileAssemblyFromFile を呼び出します。必要なコードを生成でき、C# はほとんどの CLR 機能をサポートしているため、これは機能します。しかし、これは遅くありませんか?

  3. リフレクション ILGenerator クラスを使用します。これを使用すると、考えられるすべての .NET コードを生成できると思います。しかし、これは他のアプローチよりもはるかに複雑でエラーが発生しやすいと思いますか?

  4. 他に考えられる解決策はありますか?

編集: このツールは、アプリケーションを開発するための一般的なものであり、特定のドメインに限定されません。それがビジュアルプログラミング言語と見なされるかどうかはわかりません。ユーザーは、クラス、メソッド、メソッド呼び出し、あらゆる種類の式を作成できます。実際のプログラミング言語で許可されているほとんどのことを実行できるはずなので、それほど制限はありません。現時点では、まだ多くのことをユーザーがテキストとして記述しなければなりませんが、最終的な目標は、ほぼすべてをまとめてクリックできるようにすることです。

4

6 に答える 6

4

多かれ少なかれ、.NET に基づく高水準言語を作成するために設計された動的言語ランタイムを見ると、やりがいがあることがわかります。

また、DSL を操作するためのツールへの便利なリンクが含まれている、ドメイン固有言語に関する以前のスタック オーバーフロー スレッドのいくつかを参照することもおそらく価値があります。まさにあなたの目的です。

于 2009-11-17T11:50:02.083 に答える
2

ほとんどの「クリック アンド プレイ」は、いくつかの事前定義されたビルディング ブロック オブジェクトをくっつけるだけで十分に単純なはずです (おそらく、境界でインターフェイスを使用します)。意味: 動的コード生成を行う必要はないかもしれません - ただ「それを偽造する」だけです。たとえば、DataTable値などにプロパティ バッグ オブジェクトを使用します (これは私の最初の選択ではありませんが、etc など)。

動的評価のもう 1 つのオプションはExpressionクラスです。特に .NET 4.0 では、これは非常に用途が広く、デリゲートへのコンパイルが可能です。

于 2009-11-17T11:17:37.907 に答える
1

動的コード ジェネレーターを作成したときは、System.Reflection.Emit に大きく依存していました。

基本的に、動的アセンブリをプログラムで作成し、それらに新しい型を追加します。これらのタイプは、Emit コンストラクト (プロパティ、イベント、フィールドなど) を使用して構築されます。メソッドの実装に関しては、ILGenerator を使用して MSIL オペコードをメソッドに送り出す必要があります。これは非常に恐ろしいことのように思えますが、いくつかのツールを使用して解決できます。

  • ビルド済みのサンプル実装
  • ILDasm を使用して、サンプル実装のオペコードを検査します。
于 2009-11-17T18:43:19.717 に答える
0

1) コンパイラーは高速であり、2) 「クリック アンド プレイ」は、ウィジェットの山に追加された単一のウィジェットが不正な山にならないように十分に単純でなければならないという点で、他の人にエコーします。

幸運を。本当におもちゃレベルのプログラム以外でポイント (2) を達成できるかどうか、私は懐疑的です。

于 2009-11-24T15:43:28.307 に答える
0

それはあなたの要件に依存します.CodeDOMは確かに「データモデル」に保存された「プログラム」に最適です.

ただし、オプション 2 を使用すると、他のアプローチと比較して測定可能なほど遅くなる可能性はほとんどありません。

于 2009-11-17T11:18:30.527 に答える