3

動的に生成された型に関する私の現在の理解は次のとおりです。

CodeDom を介して型を生成し、それを AppDomain にロードする場合Assembly.Unload(...)、AppDomain 全体を破棄せずにその型をアンロードする (つまり、存在しない) 方法はありません。

実行時にカスタム型を作成する方法について他に何か考えはありますか?

C# 4.0dynamicキーワードを魔法のように使用できますか? .NET 4ExpandoObjectを利用できる素敵な方法はありますか?

匿名型と動的キーワードを技術的な魔法と組み合わせることができるでしょうか?! 何か役に立つツールが散らばっているように感じます。しかし、私は間違っている可能性があります。

4

1 に答える 1

2

アセンブリまたは型が AppDomain に読み込まれると、AppDomain が取り壊されるまで存在し、期間があり、例外はありません。

そういうわけで、CodeDom は、あらゆる種類の大量に使用された場合、純粋な悪です。これは、保証されたメモリ リークとパフォーマンスの問題です。CodeDom でコンパイルするたびに、新しいアセンブリが生成されます。いくつかのオプションがあると思います:

  1. 動的な型に対してサンドボックス化された AppDomain を実行します。

  2. リサイクルとプールが許容される環境でプライマリ AppDomain を実行します。クライアント アプリケーションでは明らかにこれは不可能ですが、ASP .NET で実行している場合は、AppDomain に読み込まれたアセンブリの数を監視し、その数が臨界点に達したときにリサイクルを要求するコードを追加できます。次に、IIS で Web アプリケーションをプールするだけで、複数の AppDomain が同時に実行されるため、高可用性が維持されます。

  3. TypeBuilder と Reflection.Emit を使用します。これにより、動的に生成されたすべての型に対して 1 つの動的アセンブリを使用できます。

  4. CodeDom でできるように C# スタイルのコードを動的に生成したい場合でも、これを TypeBuilder と組み合わせて使用​​できます。そのため、動的な C# コードは、毎回新しいアセンブリではなく、動的アセンブリの TypeBuilder にコンパイルされます。これを行うには、MCS (Mono コンパイラ サービス) を使用できます。C# 形式のクラスを渡すことができ、少し調整するだけで、コードを単一の動的アセンブリにコンパイルできます。Mono Compiler as a Service (MCS)を参照してください。

于 2011-05-10T13:58:30.623 に答える