2

私のリリースフォルダは次のとおりです。

MyApp.exe
MyManagedDLL.dll
NativeDLL.dll

MyAppは、ネイティブdllをpinvokeで呼び出すマネージドdllを使用します。それらを別のサブフォルダーフォルダーに移動しようとしましたが、管理対象dllを再度参照しました。アプリを実行すると、NativeDLL.dllが見つからないと表示されます。それを修正する方法は?

4

1 に答える 1

3

Windowsは、DLLのサブディレクトリを検索する必要があることを認識していません。EXEを含むフォルダーから始めて、DLLの選択されたいくつかの場所のみを検索します。そのような苦労を与えることはあまり生産的ではありません。しかし、SetDllDirectory()をピンボークすることでそれを助けることができます。ユーザーはDLLがどこにあるかを気にしないことに注意してください。IT部門は単純なソリューションを好む傾向があり、アプリ自体がWindows検索パスを変更しているときにDLLの読み込みの問題をトラブルシューティングすることは決して楽しいことではありません。

それ以外の場合は、AnyCPU実行可能ファイルを32ビットモードと64ビットモードの両方で実行できるようにするための合理的な方法です。2つのディレクトリを使用します。1つは32ビットバージョンのDLLで、もう1つは64ビットバージョンです。そして、IntPtr.Sizeの値に基づいて、それに応じてSetDllDirectoryをピンボークします。

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);
于 2012-04-06T14:49:32.290 に答える