1

.NETFrameworkのプロファイルされたネイティブイメージから大きなメリットを得るアプリケーションを開発しています。そのため、インストール中に、いくつかの.NETアセンブリで次のコマンドを実行しています。

ngen install "ASSEMBLY NAME" /Profile

アプリケーションを展開した直後に、VisualStudio2010のユーザーのIntelliTrace機能が機能しなくなったという苦情を受けました。簡単な調査の結果、 mscorlib.dllのプロファイリングネイティブイメージが作成されるとすぐに、IntelliTraceが機能しなくなることがわかりました。また、それが発生すると、イベントビューアに次のメッセージが表示されます。

TraceLog Profilerは、プロセスにロードされたNGEN/profileアセンブリを検出しました。このようなアセンブリはサポートされていません。コレクションは無効になります。

mscorlib.dllは他の.NETアセンブリの依存関係であるため、これは特に厄介です。つまり、ngen install ... /profile任意のアセンブリで使用すると、mscorlib.dllも生成されます。

以下は、問題の簡単な複製です。

  1. 新しいコンソールアプリケーションを作成し、そのターゲットフレームワークを.NET 2に設定します。イメージに表示されているコードを追加し、SomeFunctionの後にブレークポイントを設定します。 サンプルコード

  2. IntelliTraceを「IntelliTraceイベントと通話情報」に設定します

  3. デバッグを開始します。ブレークポイントに到達すると、次の正しいIntelliTraceを取得する必要があります。 正しいIntelliTrace

  4. デバッグを停止し、VisualStudioを終了します。

  5. 昇格モードで新しいcmd.exeを開きます
  6. 実行する: %windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
  7. Visual Studioを再度起動し、デバッグを開始します。同じブレークポイントがヒットします。ただし、今回は、IntelliTraceは次のようになります。 壊れたIntelliTrace
  8. 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フラグが使用された場合でも、はインストールされたままです。

質問

  1. 他のngen/profileアセンブリがインストールされている場合でも、mscorlib / profileをNGENでアンインストールする方法はありますか?
  2. NGen / Profileの実行後にIntelliTraceを正しく機能させるための回避策はありますか?
  3. / NoDependenciesフラグが期待どおりに機能しないのはなぜですか?

ありがとう、ヴィタリー・ベルマン

4

2 に答える 2

2

さて、私はOpenCoverで同様の問題を抱えており、これを修正する方法は私が言われていることです

ngen uninstall "assembly details" /Profile 

IntelliTrace はおそらく、トレースを実行するためにライブラリをインストルメント化しようとしていますが、 JITCachedFunctionSearchStartedイベントをオーバーライドしない限り、 JITCompilationStartedイベントを取得しないため、そうすることができません。

最善の方法は、開発マシンで /Profile シナリオ アセンブリをアンインストールすることです。

私はあなたが知っていることを繰り返しましたが、なぜそれが起こっているのかについて答えを提供できれば幸いですが、それはおそらくあなた自身で解決できるものではありません.

于 2012-05-01T22:09:33.703 に答える
0
  1. 他の ngen /profile アセンブリがインストールされている場合でも、NGEN で mscorlib /profile をアンインストールする方法はありますか?

mscorlib の NIC フォルダーを削除/名前変更することで、mscorlib のネイティブ イメージを直接削除できます。たとえば、.NET 4.0 64 ビットの場合、フォルダーの場所は次のとおりです。

c:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib

于 2017-07-24T07:30:28.643 に答える