2012-01-09 5 views
2

私は、ユーザーにオンザフライで拡張性を提供する必要があるアプリケーションがあります。多くのデータといくつかの数学/数値アルゴリズムを使って、それを一種の計算エンジンと考えることができます。私はいくつかの静的フィールド(データ)とメソッド(計算)を提供し、ユーザーは有効なC#式を作成してdoubleを返す必要があります。System.Addinを使用してメモリにアセンブリが生成される

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

生成されたアセンブリがアプリケーションのライフサイクルにわたって蓄積し続けるという事実を除いて、これはうまくいきます。私が持っていたものはすべてクライアントアプリケーションでしたが、今はサーバーベースのアプリケーションに移行しており、時々サービスをリセットする必要はありません。

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

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

敬具、 カルロス

答えて

0

私はあなたのためにAddInStoreを使用しているかを理解していない(アンロードアセンブリ?)しかし、あなたはちょうどあなたがあなたの動的にロードされたアセンブリを作成することができましたとのAppDomainを(アンロードすることができます):

  AppDomain.Unload(yourAppDomain); 

多分もっと大きな問題に直面しているでしょうか。

0

DynamicMethodがお探しのものです。

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

もちろん、あなたはMZNに言及することができます。あなたは:

  1. MarshalByRefObjから派生するようにコンパイラクラスを変更します。これは、CLRがプロキシオブジェクトを作成するために必要です。あなたはちょっとチェックしなければならないでしょう.Net Remoting。それほど多くはありません。
  2. 最後に、CreateInstanceFromAndUnwrapのオーバーロードの1つを呼び出して、新しいAppDomainでコンパイラクラスにassmeblyをロードし、コンパイラのインスタンスを作成します。プロキシオブジェクトが返されます。次に、プロキシオブジェクトを使用してコンパイルを実行します。コンパイルされたアセンブリは、新しいAppDomainにロードされます。このアセンブリがもう必要ないと判断した場合、またはコンパイルされたアセンブリの数が最大に達した場合は、MZNで呼び出された呼び出しを行い、AppDomainおよびロードされたアセンブリをすべてアンロードできます。その後、新しいAppDomainから再度すべてを繰り返します。

IronPythonを使用するのが最も簡単な方法だと思います。

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

よろしくと幸運、

パノス

関連する問題