.NETFrameworkのプロファイルされたネイティブイメージから大きなメリットを得るアプリケーションを開発しています。そのため、インストール中に、いくつかの.NETアセンブリで次のコマンドを実行しています。
ngen install "ASSEMBLY NAME" /Profile
アプリケーションを展開した直後に、VisualStudio2010のユーザーのIntelliTrace機能が機能しなくなったという苦情を受けました。簡単な調査の結果、 mscorlib.dllのプロファイリングネイティブイメージが作成されるとすぐに、IntelliTraceが機能しなくなることがわかりました。また、それが発生すると、イベントビューアに次のメッセージが表示されます。
TraceLog Profilerは、プロセスにロードされたNGEN/profileアセンブリを検出しました。このようなアセンブリはサポートされていません。コレクションは無効になります。
mscorlib.dllは他の.NETアセンブリの依存関係であるため、これは特に厄介です。つまり、ngen install ... /profile
任意のアセンブリで使用すると、mscorlib.dllも生成されます。
以下は、問題の簡単な複製です。
新しいコンソールアプリケーションを作成し、そのターゲットフレームワークを.NET 2に設定します。イメージに表示されているコードを追加し、SomeFunctionの後にブレークポイントを設定します。
IntelliTraceを「IntelliTraceイベントと通話情報」に設定します
デバッグを開始します。ブレークポイントに到達すると、次の正しいIntelliTraceを取得する必要があります。
デバッグを停止し、VisualStudioを終了します。
- 昇格モードで新しいcmd.exeを開きます
- 実行する:
%windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
- Visual Studioを再度起動し、デバッグを開始します。同じブレークポイントがヒットします。ただし、今回は、IntelliTraceは次のようになります。
- IntelliTraceを同じcmdウィンドウで再度実行するには:
%windir%\Microsoft.NET\Framework\v2.0.50727\ngen uninstall "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
また、ngen.exeの/ NoDependenciesフラグを使用して、mscorlibなしで特定のアセンブリのみを追加しようとしましたが、フラグは無視されているようです-実行したにもかかわらずngen install ... /Profile /NoDependencies
、依存関係がインストールされています。実行ngen display | find "<profiling>"
すると、mscorlibが明らかになります。 / NoDependenciesフラグが使用された場合でも、はインストールされたままです。
質問
- 他のngen/profileアセンブリがインストールされている場合でも、mscorlib / profileをNGENでアンインストールする方法はありますか?
- NGen / Profileの実行後にIntelliTraceを正しく機能させるための回避策はありますか?
- / NoDependenciesフラグが期待どおりに機能しないのはなぜですか?
ありがとう、ヴィタリー・ベルマン