2

ユーザーにオンザフライの拡張性を提供する必要があるアプリケーションがあります。大量のデータといくつかの数学/数値アルゴリズムを備えた一種の計算エンジンと考えることができます。double を返す有効な C# 式をユーザーが作成できるように、いくつかの静的フィールド (データ) とメソッド (計算) を提供します。

ユーザーは有効な式をテキスト ボックスに入力し、結果を提供する必要があります。私が現在行っていることは、http://blogs.msdn.com/b/abhinaba/archive/2006/02/09/528416の手順に従って、メモリ内で生成されるアセンブリの静的メソッドに式を挿入することです。 .aspx . 次に、リフレクションを使用して特定のメソッドを呼び出し、結果を返します。

生成されたアセンブリがアプリケーションのライフサイクル全体にわたって蓄積し続けるという事実を除いて、これは正常に機能します。クライアント アプリケーションしか持っていなかったときはこれで問題ありませんでしたが、現在はサーバー ベースのアプリケーションに移行しており、時々サービスをリセットする必要はありません。

アセンブリをアンロードする方法を検索すると、System.Addin 名前空間が見つかりました。それはまさに私が望むことを行います.別のAppDomainにアセンブリをロードします.これは後で破棄できます. さらに、すべての反射をカプセル化します。

私が今抱えている唯一の問題は、AddInStore がファイル パスを想定していることですが、CompileParameters の GenerateInMemory プロパティを true に設定することにより、すべてのアセンブリがメモリ内に生成されます。アセンブリをディスクに書き込むことは絶対に必要ですか? または、実行時にコンパイルされたアセンブリをアドインとして直接使用することは可能ですか?

よろしく、 カルロス

4

2 に答える 2

0

AddInStore を何に使用しているのかわかりませんが (アセンブリのアンロード?)、appdomain をアンロードするだけです (動的にロードされたアセンブリを作成できると言った):

            AppDomain.Unload(yourAppDomain);

あるいは、もっと大きな問題に直面しているかもしれません!

于 2012-01-18T00:35:16.073 に答える
0

おそらくDynamicMethodが探しているものです。

そうでない場合は、IronPythonをご覧ください。アプリケーションに追加するのは非常に簡単で、非常に強力です。確かに、これはコンパイルされた C# コードよりも遅くなりますが、コンパイル + リフレクションよりも遅くなるかどうかはわかりません。

もちろん、MZN が言及していることを実行できます。あなたは出来る:

  1. MarshalByRefObj から派生するようにコンパイラ クラスを変更します。これは、CLR がプロキシ オブジェクトを作成するために必要です。少し .Net Remoting を確認する必要があります。多すぎません。
  2. 独自の AppDomain を作成し、
  3. 最後に、CreateInstanceFromAndUnwrap のオーバーロードの 1 つを呼び出して、新しい AppDomain にコンパイラ クラスを含むアセンブリを読み込み、その上にコンパイラのインスタンスを作成します。プロキシ オブジェクトが返されます。次に、プロキシ オブジェクトを使用して実際のコンパイルを行います。コンパイルされたアセンブリは、新しい AppDomain に読み込まれます。このアセンブリがもう必要ないと判断した場合、またはコンパイルされたアセンブリの最大数に達した場合は、MZN で言及されている呼び出しを行い、AppDomain と読み込まれたすべてのアセンブリをアンロードできます。次に、新しい AppDomain からもう一度すべてを繰り返します。

最も簡単な方法は、IronPython を使用することだと思います。

現在、私は、オンサイトでの C# コードのコンパイル (System.CodeDom を使用) を含む MAF ベースのアプリケーションに取り組んでいます。それはあなたのものに似ていますが、私の場合、コンパイルはアップグレード後にのみ行われます。したがって、多くの「スクリプト」アセンブリがロードされても問題はありません。また、ファイル システム上にアセンブリをビルドします。

よろしくお願いします。

パノス

于 2012-03-30T17:05:51.320 に答える