4

私の仕事では、.net Framework 4 を使用してさまざまなアプリケーションを開発しています。すべてのアプリケーションは、data.dll のデータ レイヤーなど、開発した共通のアセンブリを使用します。これらのアプリケーションはネットワーク ドライブに常駐し、そこから直接起動されます。

ほとんどの大きなアプリケーションは、最初の起動 (コールド スタートアップ) に 4 ~ 5 秒程度の時間がかかります。その後の起動ははるかに高速で、ほぼ瞬時です。最大のアセンブリは約 900KB で、ギガビット ネットワークを使用しているため、ネットワークとは関係ないと思います。

コンピューターの起動時に開始され、特定のディレクトリの下にあるすべての .net アセンブリを読み込むサービスを作成したいと考えています。ユーザーがプログラムを起動したときに、必要なすべてのアセンブリが既に読み込まれて「JIT」されているため、起動が速くなることを願っています。

サービスの作成方法は知っていますが、CLR の理解がかなり限られているため、これが機能するかどうかを知りたいです... しばらくプログラムを起動しない場合、プログラムはロードされたままになりますか、それともしばらくすると自動的にアンロードされますか? 既に読み込まれているアセンブリを変更するとどうなりますか?

基本的に、 OpenOffice Quick starterのようなことをしたいと思いますが、独自のアプリケーション フレームワークを対象としています。

みんな、ありがとう!!!

---編集---
これは興味深いです...正しい方向に進んでいるようですが、すべてを理解しているかどうかはわかりません...

4

4 に答える 4

2

JIT コンパイルが問題ではなく、2 回目の起動も遅くなることは既にご存じでしょう。ファイル システム キャッシュ内の DLL を取得するだけです。そのため、後でプログラムを起動するときに、ネットワークに接続されたドライブを調べて見つけるのではなく、キャッシュからその DLL のコピーを使用します。時間がかかっているものです。Office Quick Start も同じトリックを使用しています。このプリロードされたものがすべて収まらなくなったら、誰が勝つかわかりません.

ウィンドウを取得しないように Winforms アプリを作成し、Assembly.Load() を呼び出してアセンブリを読み込み、File.ReadAllBytes() を呼び出してコンテンツ全体がキャッシュにあることを確認します。このプログラムへのショートカットを Startup フォルダーに配置します。あなたが言及したその 1 つのアセンブリは、Ngen.exe からのウォーム スタートを促進するのに十分な大きさです。ただし、これは個々のワークステーションで実行する必要があります。

于 2010-10-21T18:47:51.033 に答える
1

次の記事で説明する手法を使用して、プログラムでアセンブリを事前にコンパイルできます。アセンブリをオンザフライで事前コンパイル(pre-JIT)するか、事前にJITコンパイルをトリガーします。

ただし、あるプロセスでそれらを結合しても、別のプロセスに影響があるとは思いません(それについてはわかりません)。考えられる解決策の1つは、アセンブリのみを事前に設定し、他には何もしないことを示すコマンドラインオプションを使用して、コンピューターでアプリケーションを起動することです。ユーザーがアプリケーションを起動すると、すでに実行中のプロセスにデフォルトの機能を開始するように指示します。

于 2010-10-21T17:48:46.350 に答える
0

いくつかのオプションがあります。共通のアセンブリに強い名前があると仮定すると、それらはユーザーのグローバルアセンブリキャッシュ(GAC)に配置できます。これらのアセンブリが安定している場合は、ngen.exeを使用してネイティブコードを生成できます。これにより、必要な「事前JIT」が可能になります。詳細については、GoogleGACおよびngenを参照してください。

質問の更新後に編集:

探している方法でアセンブリをロードすることが必ずしも最も効果的な方法であるとは限りません。これらのアセンブリは、サービスが存在する限りサービスのメモリに残り、クライアントマシンに負担がかかる場合とそうでない場合があります。

アセンブリのGACとngenの組み合わせが最善の策であり、アセンブリを取得してgacutilに外部呼び出しを行うことで、これらの手順の両方を自動化できると思います(サービスが適切なアクセス許可で実行されていると仮定します)。クラスを使用するexeおよびngen.exe System.Diagnostics.Process

ngen.exeのMSDNページ

gacutil.exeのMSDNページ

ProcessクラスのMSDNページ

于 2010-10-21T17:29:07.943 に答える
0

必要なのは、アセンブリをプリコンパイルするNGENです。あなたが抱える問題は、ネットワークからのアセンブリであり、異なるCPUアーキテクチャ用にロードされる可能性があることだと思います。NGENは、コンピューターが使用する特定のアーキテクチャー用にコンパイルおよび最適化されるため、宛先コンピューターで実行する必要があります。

考えられるのは、アセンブリに厳密な名前を付けて、各コンピューターのGACにインストールすることです。

あなたが検討しているアプローチがうまくいくとは思いません。それらをサービスプロセスにロードし、リリースされるとシステムによってクリーンアップされ、最終的な結果は得られないと思います。スピードアップ。

于 2010-10-21T17:32:28.690 に答える