3

解決策のある投稿が見つかりました失敗したDllImportを処理するにはどうすればよいですか?

ホストがVistaシリーズとNTシリーズのどちらのバージョンのWindowsを使用しているかに応じて、OSのバージョンをチェックしてさまざまな処理を実行するアプリを作成しています。Vistaシリーズの場合、(DllImportを使用して)いくつかのDLLをロードしますが、それ以外の場合はこれらを使用しません。問題は、DllImportを使用してそれらをロードすると、それらのDLLがない古いバージョンのWindowsで使用した場合、実行時にDllNotFoundExceptionが発生することです。

DllNotFoundExceptionsをキャッチ/防止/無視するにはどうすればよいですか?未処理の例外イベントで例外を「処理済み」に設定しようとすると、アプリを続行できません。

4

2 に答える 2

2

win32 LoadLibrary / GetProcAddress / FreeLibraryとデリゲート(コールバック関数で行うのと同じように)を使用して、「従来の」方法を実行できるはずです。

http://msdn.microsoft.com/en-us/library/d186xcf0.aspxが出発点になる可能性があります...

これで始められるはずです:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);

[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

次に、呼び出されるエクスポートの正しい署名を使用してデリゲートを宣言し、 Marshal.GetDelegateForFunctionPointer()を使用して、 GetProcAddressから取得した関数ポインターからデリゲートを作成します。

于 2009-11-06T10:35:04.560 に答える
1

オプションとして、LoadLibraryまたは静的リンクを使用してWindows dllへのすべての呼び出しを転送し、それらのdllがない場合は手動で処理する、ある種のデコレータコンポーネントをC ++/CLIで記述できます。

于 2009-11-06T10:34:02.697 に答える