2011-02-04 9 views
19

私のアプリでは、マウスをクリックしてフォームを表示する必要があります。問題は、フォームが別のアセンブリにあり、アセンブリの読み込みが遅延するため、マウスボタンを押したときにアセンブリがまだ読み込まれていない可能性が高いことです。だから私が持っているのは、フォームが最終的に現れる前に非常に目立つ休止です。.NETアセンブリをプリロードする良い方法

初期化メソッドでnew FormFromAnotherAssembly()を呼び出すことで、私はダム修正を思いつきました。それはもちろん、物事を世話し、一時停止はもはやそこにありませんが、それは非常に醜いです。私がこのソリューションについて気に入っているのは、Assembly.Loadのようなものを使用したい場合には、パスとアセンブリ名を混乱させる必要がないことだけです。

実際に必要となる前にアセンブリがロードされていることを確認したい場合は、どうすればよいでしょうか?

ありがとうございます。

+0

あなたは良い解決策を却下しています。他の唯一のものは、より高速のハードドライブを取得することです。あなたが過去6ヶ月間にディスクをデフラグしていないなら、今は楽しい時です。 –

+0

@ハンスパッサント:どちら? – Dyppl

答えて

19

あなたのinitで明示的なプリロードがおそらく最良の選択肢です。

typeof(SomeTypeFromAnotherAssembly)は、最適化できないいくつかの不透明な方法と一緒に十分です。おそらく:

GC.KeepAlive(typeof(SomeTypeFromAnotherAssembly)); 

これにより、newが回避されます。あなたはBGのスレッドでそれを行うことができ、これはをロードしますが、あなたが望む場合など

をJITコンパイルされないことに注意してください:

private static void LoadSomeStuff(object state) { 
    GC.KeepAlive(typeof(SomeTypeFromAnotherAssembly)); 
} 
... 
ThreadPool.QueueUserWorkItem(LoadSomeStuff); 
+0

Marcさん、ありがとうございます。でも、ロードしてJITしたい場合はどうすればいいですか?アセンブリをロードするように見えるので、問題の一部に過ぎず、一時停止はまだ存在します。 – Dyppl

+0

@Dyppl - JITは比較的高速です - 他の*(下流)アセンブリを読み込んで他のリソースを読み込むことが問題であることをお勧めします。あなたがデバッグすれば、他に何がロードされているか見ることができるはずです... –

+0

残念ながら、フォームはWPFのものであり、それに沿って多くのひどいものをドラッグします。 – Dyppl

1
var yourAppPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
Assembly.Load(Path.Combine(yourAppPath, "formAssembly.dll")); 

ですか?

+2

これは私が "パスとアセンブリ名を混乱させる"と呼ばれるものなので、実行しません。 – Dyppl

+0

アセンブリが同じフォルダにある限り、常に動作します。だから私はそれを乱すとは見ません。 – jgauffin

+0

また、それらは同じフォルダにありません – Dyppl

2

私はAssembly.Loadが道であると信じています。

アプリケーションの起動時に、モジュール、プラグインまたはその他のランタイムプラグイン可能なものを見つけ、そのアセンブリをアプリケーションのドメイン(AppDomain)にロードする必要があります。

または別のより良いオプション:なぜそれの制御の反転を使用しないでください?

キャッスルウィンザーを使用できます。実行時にロードする4つのフォームがあるとしましょう。そのため、プログラムのライフサイクル中にロードする4つのフォームが実装されているFormクラスの4つのコンポーネントを作成できます。

この方法でどのようにプリロードするのですか?あなたは、単にフォームのタイプのものであり、すべての依存関係/コンポーネントを解決し、あなたはそれを得た:あなたがコントロールの反転がわからない場合

container.Resolve<Form>("CustomersForm"); // Just an example 

container.ResolveAll<Form>(); 

後で、特定のフォームを取得します、コメントアウトして、私はあなたを助けるでしょう、問題はありません! :)

+0

これは私の問題のためにちょっと残酷に思えますが、ありがとう – Dyppl

+0

実行時に読み込まれたフォームがたくさんあると思います。これが状況でない場合、はい、これはあなたにとって不幸です。 –

+0

まあ、現時点ではそうだとは思えませんが、とにかくありがとう、私は必要があるときにあなたの解決策を試みます。 – Dyppl

0

私は最も簡単な方法はアセンブリでアセンブリ名を使用することだと思います。ロード():

System.Reflection.Assembly.Load("ICSharpCode.AvalonEdit"); 

あなたはVisual Studioで参照プロパティの下でアセンブリ名を見つけることができます。

assembly name in visual studio

あなたがなどのdllファイルのパスを入力する手間を省くことができ、この方法を私は速度にこれを使用このDLLを使用するダイアログの読み込みを開始します。プログラムメインウィンドウが完全にロードされるとすぐにAssembly.Load()を呼び出すバックグラウンドスレッドが起動されます。ユーザーがこのダイアログを開くと、このDLLをロードする際のわずかな遅延がなくなります。

関連する問題