問題タブ [ngen]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - NGen と Gacutil のベスト プラクティス
私が作成した約 5 つの参照アセンブリと、サード パーティによる約 8 つの参照アセンブリを持つ WinForms アプリケーションに取り組んできました (何かひどく問題が発生しない限り、将来的には更新する予定はありません - Infragistics/DevExpress コンポーネント! )。
私たちの起動時間は、コールド ブーツでは少し長すぎます。私が疑問に思っているのは、コールド ブーツを Gac に追加して ngen 化する方法があるかどうかです。
NGen キャッシュにインストールする場合、gac にもある必要がありますか? 2つの関係は何ですか?どれを目指せばいい?exe が 1 つあり、ILMerge を実行しますが、それがシナリオで機能するかどうかはわかりません - 長い話です。
また、私のexeがどれだけのメモリを消費しているかを取得することは可能ですか - Javaアプリケーションが行うのと同じように(Netbeansのように!)
.net - .NET アセンブリ キャッシュ / ngen / jit イメージのウォームアップとクールダウンの動作
C++/CLI を介して C#.NET 2.0 DLL でビルドされたインプット メソッド (IME) プログラムがあります。IME は常に別のアプリケーションに接続しているため、C#.NET DLL はイメージ アドレスのリベースを回避できないようです。
ngen を適用してその C#.NET 2.0 DLL のネイティブ イメージを作成し、グローバル アセンブリ キャッシュにインストールしましたが、あまり改善されず、約 12 秒かかりました。9秒まで。遅い PIII レベルの PC で。
したがって、起動時に C#.NET DLL によって参照されるすべてのコンポーネントをロードする小さなアプリケーションを使用して、その DLL のネイティブ イメージを "ウォームアップ" します。読み込み時間を 0.5 秒に短縮することは問題なく機能します。
しかし、それはしばらくの間しか機能しませんでした。約30分 後で、再び「クールダウン」するようです。
GAC またはネイティブ イメージの動作を常に「ホット」に制御する方法はありますか? これはまさにイメージアドレスのリベースの問題ですか?
.net - Wix3.0でのステップバイステップのngen
Wixを使用して.NETアプリケーションのインストーラーを構築し、Wix3.0への移植を進めています。
私たちのアプリケーションにはいくつかの.NETアセンブリが含まれており(.NETアプリケーションの場合と同様)、最後のインストーラーステップはこれらをngenすることです。ngenされていないアセンブリを使用してアプリケーションを起動するには、約2倍の時間がかかるため、これは重要です。
残念ながら、インストールの手順には数分かかります。インストーラーがまだ機能していることを視覚的にフィードバックしたいと思います(少なくとも1人のユーザーがインストーラーがクラッシュしたと思っていました!)。最初のユーザーエクスペリエンスを大幅に悪化させるため、ngeningをバックグラウンドに移動するだけでは不十分です。アプリケーションの起動が非常に遅くなります。
アセンブリを個別に生成し、各アセンブリが完了するたびに、インストーラーで(メッセージと進行状況バーを介して)ユーザーに報告します。Wixにngeningを実行させるのは簡単で、背景に移動するのは簡単ですが、私たちが望むことを達成するための簡単な方法はわかりません。良いアイデアやテクニックはありますか?
(私たちのアプリケーションは.NET 2.0 SP1と互換性があるため、これを実現するために.NET 3+の何にも依存したくありません。)
minidump - 「ngen」されたイメージの WER ミニダンプをデバッグする方法
インストール時に .NET マネージド アプリケーションで ngen が実行され、アプリの Windows エラー報告からクラッシュ ダンプが取得された場合、それを使用してスタック トレースや変数などを確認するにはどうすればよいでしょうか?
質問に関連する背景を次に示します。インストール時に生成される .NET アプリがあります。未処理の .NET 例外が原因でクラッシュした場合、クラッシュは Windows エラー報告に分類され、そこから winqual.microsoft.com から minidump.mdmp ファイルをダウンロードできました。
クラッシュしたアプリのビルド用の .dbg ファイルを含むフォルダーに minidump.mdmp を配置し、minidump.mdmp をダブルクリックして、VS2008 SP1 の新しいインスタンスで開きました。私のスタック トレースは次のようになります。
kernel32.dll!RaiseException() + 0x3d バイト
mscorwks.dll!RaiseTheExceptionInternalOnly() + 0x295 バイト
mscorwks.dll!JIT_Throw() + 0x130 バイト
MyApp.ni.exe!000007feee74c84c()
[以下のフレームは正しくないか、欠落している可能性があります。 MyApp.ni.exe のシンボルがロードされていません]
0000000070000d5e()
MyApp.ni.exe!000007feee611000()
000000000300bf78()
000000000300bf60()
[モジュール] ウィンドウには、OS および .NET DLL のシンボルが読み込まれていることが示されますが、アプリケーション モジュールの場合は次のようになります。
MyApp.exe -> シンボル ファイルにネイティブ シンボルがありません。
MyApp.ni.exe -> 一致するバイナリが見つかりません。
MyAppsLibrary.ni.dll -> 一致するバイナリが見つかりません。
.net - NGEN以前のアセンブリを配布することは理にかなっていますか?
この投稿から、インストーラーの最終ステップとしてNGENを使用することに関するいくつかの興味深いリンクを見つけました。ビルド時ではなく、セットアップ時にアセンブリをNGENすることが望ましい理由はありますか?セットアップ時間については特に気にしませんが、ビルドによって自動化できる不要な手順のようです。
c# - .net アプリケーションの起動時間と実行時間を短縮するにはどうすればよいですか?
C# を使用して、.NET フレームワークで Windows アプリケーションを作成しています。これらのアプリケーションの起動時間を短縮するにはどうすればよいですか? アプリケーションの起動時と初期化時に、特に初期フォームを表示するときに、非常に遅く感じます。
私のアプリケーションは Access (MDB) データベースと連携してデータを保存します。一部のフォームではデータをロードしますが、アプリケーションが特定のフォームを初めて表示するときは、表示に時間がかかります。
NGen を使用して起動時間を短縮しようとしましたが、期待どおりにはなりませんでした。
.net - アセンブリがngen'dされているかどうかを判断する方法は?
特定の .Net アセンブリが既に ngen 化されているかどうかをどのように判断できますか? コードから確認する必要があります。コマンドラインを呼び出しても問題ありません。現時点では、これを決定する方法がわかりません。
.net - GACおよびNGenのアセンブリが使用されているかどうかを確認します
ローダーが実行時にアセンブリの署名を検証せずに、またはGACされたアセンブリを使用して、ネイティブイメージが使用されているかどうかを確認するにはどうすればよいですか?
NGenで実験している複雑なシステムがありますが、現在、実行時バインディングの依存関係が多いため、すべてのDLLが配置されているフォルダーからexeを実行しています。プロセスエクスプローラーを見ると、ネイティブイメージが使用されていますが、完全なメリットが得られ、ローダーの検証手順が不要であることをどのように確認できますか?
乾杯、グレイム。
更新: アセンブリバインディングログビューアからこの種のものをたくさん取得しています:
そして最後に
したがって、ネイティブイメージを使用していますが、それらを検証しています。つまり、ネイティブイメージを作成した場所であるにもかかわらず、GACバージョンを使用していません。
脚注: この記事は、アセンブリがGACからロードされていない場合、検証プロセスがNGenの利点を相殺することを示唆しているようです。 CLR Inside Out-アプリケーション起動パフォーマンス(MSDN)の改善
更新-Nobugzが以下のコメントで指摘しているように、3.5 SP1以降、上記の検証手順は実行されません。NGenのMSDNドキュメントを参照してください。
.net - .NET dllをバンドルして、.NETのないマシンでアプリケーションを実行しますか?
AFAIK、ngenはMSILをネイティブコード(pre-JITとも呼ばれます)に変換しますが、起動時のパフォーマンスへの影響についてはあまり注意を払っていませんでした。Ngenされたアプリケーションには、引き続き.NET基本クラスライブラリ(ランタイム)が必要です。
基本クラスライブラリには.NETアセンブリに必要なものがすべて揃っているので(正しいですか?)、ランタイムをインストールする必要がないように、フレームワークのDLLをngenのアプリケーションと一緒に出荷することは可能でしょうか?(たとえば、ほとんどのWindows XPマシンのシナリオ)
ああ、 RemotesoftのSalamanderLinkerやXenocodeのPostbuildについては気にしないでください。それらは私の(そして多くの)現在の予算のためではありません(そしてそれらは単に仮想化された環境にフレームワークをバンドルしているようです、それは大きなダウンロードサイズと遅い起動時間を意味すると私は信じています)
編集:
私は今知っています、ngenは私が思ったことをしません。
しかし、VMを使用せずに.NETファイルをアプリケーションにバンドルすることは可能ですか?
.net - .NET での動的リンクに対する保護
ライセンスを添付してアプリケーションをデプロイしたい。ただし、Visual Studio で自分の dll を簡単に参照できないようにしたいと考えています。
これを行う通常の方法は何ですか?これを防ぐためにアプリケーションをngen化することを考えていましたが、コードはアーキテクチャに依存します。Windows 以外のアーキテクチャ/プラットフォームを対象としているわけではありませんが、リリース ビルドを作成した後にアプリケーションを ngen-ing することは、回避策のように思えます。これを達成するための他のテクニックはありますか?