2009-05-29 1 views
1

Windows winformsアプリケーションを呼び出すコマンドラインwinforms実行可能ファイルがあります。他のアセンブリがアプリケーションに使用可能かどうかを検出する方法

時々、アプリケーションをデプロイするときにコマンドラインのexeでウィンドウズEXEをインクルードするのを忘れてしまい、エラーが発生します。

私は優雅にそれを処理し、代わりの素敵なエラーを表示するにはどうすればよい:

未処理の例外: System.IO.FileNotFoundException: 「MyappFoo、 バージョン= 5.1のファイルや尻emblyをロードできませんでした。 4303.0、Culture =ニュートラル、 PublicKeyToken = null 'またはその のいずれかの依存関係です。指定されたファイル が見つかりません。ファイル名: ' 文化=中立MyAppFoo、バージョン= 5.1.4303.0、なPublicKeyToken = nullを' AppFoo.Program.Mainで (文字列[] args)を

WRN:アセンブリバインディングログは がオフになっています。アセンブリのバインドを有効にするには、 値[HKLM \ Software \ M \ Microsoft \ Fusion!EnableLog](DWORD)を に設定します。注:アセンブリのバインドにはパフォーマンスの低下があります。 失敗します。この機能を無効にするには、 をオフにして、レジストリ値 [HKLM \ Software \ Microsoft \ Fus ion!EnableLog]を削除します。

編集:

ビットを明確にするために、どのように私はどちらかのとき

static int Main(string[] args) 
{ 
    try 
    { 
     Console.WriteLine"MyPhooApp Command Line (c) PhooSoft 2008"); 
    } 
    catch (System.IO.FileNotFoundException fe) 
    { 
     Console.WriteLine("Unable to find foo.exe"); 
     return -1; 
    } 
} 

のdoesntののwriteln、FileNotFoundExcceptionを傍受します。

答えて

4

.NET 2.0で導入されたReflection-Onlyローディング機能を使用できます。これにより、実際にappdomainにロードすることなく、検査のためにアセンブリをロードすることができます。

Assembly.ReflectionOnlyLoad

Assembly.ReflectionOnlyLoadFrom

+0

アセンブリが見つからない場合でも、これらの関数はFileNotFound例外をスローしますが、発生する可能性のあるタイミングを正確に知ることができる点は注目に値します。 –

+0

真ですが、もう1つの利点は、通常のアセンブリロードAPIを使用して試すと、アプリケーションがアセンブリのプローブを再試行しないことです。 もう1つの利点は、バインディングコンテキストを壊すことなく、ファイルパスでReflectionOnlyLoadFromを使用できることです。ファイルパスでAssembly.LoadFromを使用すると、同じアセンブリを2回読み込むことができます。 – Josh

+0

Err ...同じアセンブリを2回ロードしようとしています。 loadfromコンテキストで読み込まれたアセンブリを解決しようとすると、融合が失敗すると思います。 – Josh

0

あなたは単にFileInfo.Existsを持つファイルを探しませんか?

+0

いいえ、Mainメソッドが呼び出される前に例外がスローされます。 – WOPR

関連する問題