19

最近、.Netの動的アセンブリについて何か知っているかどうか尋ねられました。簡単な答えは-私はしません。

動的アセンブリを作成する方法を説明する記事をたくさん見つけましたが、次のことを真に説明する記事はありません。

  • それらが何であるか(それらがメモリから直接実行されることを除いて)
  • 静的アセンブリに比べてどのような利点がありますか
  • それらの実際の使用例

上記の説明をいただければ幸いです。

どうもありがとう。

4

2 に答える 2

7

いくつかの例を挙げます:

  1. ASPNET は、ASPX、ASMX、または ASHX ごとにアセンブリを生成し、それらを動的に読み込みます。ここでの本当の利点は、アプリケーション コードをテンプレート言語でデプロイでき、動的にコンパイルしてオンデマンドで実行できることです。動的な部分は、非常にシンプルで便利な展開モデルを実現し、効率も意味します。呼び出されたページのみが実際に読み込まれます。

  2. DotNetZip は、自己解凍型アーカイブを保存するときに動的アセンブリを作成します。実際には「メモリから実行」ではなく、最終的にはファイルに書き込まれるため、動的アセンブリの定義に適合する場合と適合しない場合があります。アセンブリ実行時に動的に作成されます。しかし、その時点では呼び出されません。動的に作成する理由 exe は特定の Win32 アイコンを使用できる必要があるため、バージョン番号やその他のプロパティが必要になる場合があります。これらはコンパイル時に設定できます。また、アセンブリのソース コードはテンプレートから派生し、呼び出し元によって提供されたさまざまなデータを使用してテンプレートのスロットに入力されます。したがって、動的に生成されたアセンブリは、ここに行くのに本当に正しい方法です。

  3. .NET の ASMX Web サービス フレームワークでは、wsdl.exe コンパイラ (または xsd.exe ツール) が XML メッセージをシリアル化/逆シリアル化する型を生成します。通常、パブリックフィールドとしてモデル化された XML 要素を持つ型を出力します。ただし、DataGrid およびその他のデータ バインド コントロールはオブジェクトの配列をデータ ソースとして使用できますが、表示されるのはパブリック プロパティのみでした。したがって、アプリは webservices 呼び出しを実行できず、オブジェクトの配列を取得して、それを Datagrid のソースとして割り当てることができませんでした。動的に生成されたアセンブリをアダプターとして使用して、データ駆動型コントロールが Web サービス呼び出しの出力を使用できるようにしました。[この問題は、ObjectDataSource と .NET のその他の変更により解消されたと思います]。

  4. .NET の内部では、特定の型の System.Xml.Serialization.XmlSerializer クラスをインスタンス化すると、アセンブリが動的に生成されます。ここでの勝利は、解釈されたコードとコンパイルされたコードの比較と同じだと思います。xml シリアライゼーションでは、基本的な考え方は、型のパブリック フィールドとプロパティを列挙し、それらのフィールドと props からの値を含む XML ドキュメントを出力することです。XmlSerializer.Serialize() が呼び出されるたびに、アプリが型のメンバーを列挙するために System.Reflection を使用する必要がない (非常に遅い) としたら、すばらしいと思いませんか?


これは、誰かが動的アセンブリを作成したいというシナリオを説明する最近の SO の質問です:
コード生成を使用して C# メソッドを動的に作成する方法は?

于 2010-03-07T01:40:39.660 に答える
6

この記事は少し古く、コードは少し「素朴」ですが、動的コンパイルといくつかの顕著な問題に関して最もアクセスしやすい記事の 1 つと言えます。

ここで、アセンブリをその場でコンパイルする方法を学びました。アンロードやセキュリティの制御が不要なときはメモリ内で、アンロードできるようにリモート処理で読み込まれる一時ファイルにコンパイルします。

実際の例: サンドボックス化されたアセンブリに動的にコンパイルされ、置換の実行に使用され、破棄される置換メソッドの C# コードを受け入れるオンライン .net 正規表現ツール。この戦略はうまく機能しましたが、サンドボックスに関係なく悪意のあるコードが挿入される可能性が非常に高かったため、このアイデアは最終的に破棄されました。

幸運を。

于 2010-03-07T00:59:42.253 に答える