2016-04-13 30 views
2

私は管理されていないDLLを呼び出すC#コードを持っています。dllの存在を確認する方法

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)] 
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved); 

このコードは、多数のユーザーを対象とする別のアプリケーションで使用されるWindowsフォームコントロールソリューションに存在します。

DllImport属性は、システム上でdllを探し、見つかった場合はextern関数をそれとペアにします(ほとんど私はexternがC言語でどのように動作するかを知っています)。

このDLLがユーザーのシステムで確実に検出されるようにするにはどうすればよいですか?私はそれを私のアプリケーションにバンドルする必要があります(私はその方法を知っています)? Windows *に含まれているので、それが存在することは確実ですか?


*私が見つからないため、Windows XPのDLLと古いのクラッシュ多くのアプリケーションを見てきましたので、私は本当にその引数を信用していません。

+1

この質問をチェックしましたか? http://stackoverflow.com/questions/2292578/check-if-a-dll-is-present-in-the-system ユーザーのコンピュータにDLLが存在するかどうかを確認するために使用できるコードが含まれています。 – Alex

+0

これはXP以降の[Windows/IEの一部としてMSDNに記載されている機能](https://msdn.microsoft.com/library/ms775125)の特別なケースです。サポートされなくなった長いバージョンのWindowsでコードを実行することを期待している場合を除き、この*特定の*関数は常に存在すると期待できます。 *一般的な質問はもっと複雑です。 –

答えて

1

DLLが存在することを保証するための主要な責任当事者はあなたのアプリケーションではありませんが、インストーラ!アプリケーションの実行時には、依存関係について心配するのは遅すぎます。しかし、インストーラが失敗したときにもっとうまく機能しないようにしたい場合は、次のようにすると便利です。


実際に呼び出しが成功するかどうかを確認します。インポートした関数をtry-catchブロックで呼び出すだけで、呼び出しが成功するかどうか確認することができます。もちろん

bool available = true; 
try { 
    UrlMkGetSessionOption(...test parameters...); 
} 
catch (DllNotFoundException) 
{ 
    available = false; 
} 
catch (EntryPointNotFoundException) 
{ 
    available = false; 
} 

これだけで、:DLLが見つからなかった場合はDLLが発見されたが、How do I handle a failed DllImport?に答えに従って、そしてEntryPointNotFoundExceptionがスローされた機能を持っていない場合、DllNotFoundExceptionがスローされ、 DLLにテストパラメータで呼び出すことができる関数がある場合は動作します。 URLMonの場合、例に示すように、適切な関数はUrlMkGetSessionOptionとなります。それがない場合は、最初に呼び出されたときを知っているので、最初の呼び出しをテストでラップすることができます。

しかし、DLLが存在しない場合、プログラムは合理的に何をすることができますか?これを使用するオプション機能の場合は無効にすることができますが、通常はDLLが存在しないか機能していない場合、プログラムは機能しません。私は、このための使用は、後で失敗するのではなく、フレンドリーなエラーメッセージで迅速かつ予測可能に失敗することだと思います。

+0

ありがとう、それは私が探していたものです。私はclickonceを使用するつもりだったので、インストーラがシステムから必要とするものをあまり制御することはできませんが、私はそれを設定することができます。 –

関連する問題