ドメインの中立性を指定せずに、.NETネイティブ画像(NGEN)を複数のアプリドメインにロードするにはどうすればよいですか?
-
12-10-2019 - |
質問
ngen + appdomainの問題はこちら。
.NETアプリケーションでのひどいJIT時間を防ぐために、ネイティブ画像を正しくロードすることを中心に展開するアプリケーションの変更に取り組んでいます。一部の部品は簡単でしたが、アプリドメインにロードする必要があるアセンブリ(アプリはさまざまな理由で使用する必要があります)は、ネイティブ画像を初めてロードし、その後のロード(現在は新しいAppDomain)でのみロードされます。画像は拒否され、JITが発生します。
私はドメイン中立の負荷についてすべて知っており、それが理にかなっているいくつかのアセンブリにすでにそれを利用していますが、ドメインに中立な負荷をかけることで、私たちのためにAppDomainsを使用する主な理由の1つがキャンセルされます - ドメインニュートラル画像は決してアンロードできないためです。
簡潔に言えば、ネイティブの画像をロードしてアンロードする方法が必要です。私は、再びロードしようとする前にネイティブ画像の最初の使用法を降ろした限り、通常の制限が適用されないことを望んでいましたが、これはネイティブ画像を同時にロードしようとする場合のように拒否されました。
このMSDNの記事 次の引用が含まれています。
JITコンピレーションに戻るための代替アプローチは、ネイティブ画像のさまざまなコピーをすべてのアプリドメインにロードして、対応するアセンブリをドメイン固有としてロードすることです。ただし、このアプローチでは、ngen画像のすべてのコピーを除き、最初のコピーを除き、優先ベースアドレスとは別のアドレスにロードする必要があります。したがって、ngen画像のこれらのコピーはすべて、アドレスを修正する必要があります。
これは私のニーズにぴったりですが、その記事は私が今まで見たことがある唯一の場所であり、それがどのように実装されるか確信が持てません。
洞察を前もってありがとう、そして見てくれてありがとう。
解決
私は、再びロードしようとする前にネイティブ画像の最初の使用法を降ろした限り、通常の制限が適用されないことを望んでいましたが、これはネイティブ画像を同時にロードしようとする場合のように拒否されました。
これは機能しますが、ネイティブ画像が実際にアンロードされるのを待つ必要があります。 AppDomain.Unloadが返されると、AppDomainは完全にアンロードされていません。 AppDomainは、次の完全なGCの後にのみ(ネイティブ画像とともに)完全にアンロードされます。
このMSDNの記事には、次の引用が含まれています。
Surupaは、CLRでの代替実装の可能性について推測していましたが、これは現在実装されていません。
ラクシャンフェルナンドCLRチームに感謝します