2

NGEN+AppDomainの問題はここにあります。

.netアプリケーションでのひどいJIT時間を防ぐために、ネイティブイメージを正しくロードすることを中心に展開するいくつかのアプリケーションの変更に取り組んでいます。一部のパーツは簡単でしたが、アプリドメインにロードする必要のあるアセンブリ(アプリはさまざまな理由で使用する必要があります)は、最初にネイティブイメージをロードし、その後のロード(現在は新しいアプリドメイン)でのみロードします画像は拒否され、JITが発生します。

私はドメイン中立の読み込みについてすべて知っており、それが理にかなっているいくつかのアセンブリですでにそれを利用していますが、ドメイン中立の読み込みを行うと、最初にアプリドメインを使用する主な理由の1つがキャンセルされます-ドメインニュートラルイメージはアンロードできないためです。

簡潔に言えば、ネイティブイメージのロードとアセンブリのアンロードを行う方法が必要です。ネイティブイメージを最初にアンロードしてから再度ロードする限り、通常の制限が適用されないことを期待していましたが、ネイティブイメージを同時にロードしようとした場合と同じように、拒否されました。

このMSDNの記事には、次の引用が含まれています。

JITコンパイルにフォールバックする別のアプローチは、対応するアセンブリをドメイン固有としてロードするすべてのAppDomainにネイティブイメージの異なるコピーをロードすることです。ただし、このアプローチでは、最初のイメージを除くNGenイメージのすべてのコピーを、優先ベースアドレスとは異なるアドレスにロードする必要があります。したがって、NGenイメージのこれらのコピーはすべて、アドレスを修正する必要があります。

これは私のニーズにぴったりですが、その記事は私が今までに言及した唯一の場所であり、それがどのように実装されるかはわかりません。

洞察を事前に感謝し、見てくれてありがとう。

4

1 に答える 1

3

ネイティブイメージを最初にアンロードしてから再度ロードする限り、通常の制限が適用されないことを期待していましたが、ネイティブイメージを同時にロードしようとした場合と同じように、拒否されました。

これは機能しますが、ネイティブイメージが実際にアンロードされるのを待つ必要があります。AppDomain.Unloadが返されるとき、appdomainは完全にアンロードされていません。appdomainは、次の完全なGCの後でのみ、(ネイティブイメージとともに)完全にアンロードされます。

このMSDNの記事には、次の引用が含まれています。

Surupaは、CLRでの可能な代替実装について推測していましたが、これは現在実装されていません。

LakshanFernandoCLRチームに感謝します

于 2011-01-31T21:59:46.697 に答える