私が作業しているベンダーから提供されたサードパーティのDLLを呼び出すC#クラスライブラリを構築しています。ベンダーの例はすべてvC++で動作し、動作しています。c# - LoadLibraryを使用すると、Win32Errorで0が返されます。193
私はDLLの1つをロードしようとしており、IntPtr
を返しています。Marshal.GetLastWin32Error()
を呼び出すと193が得られます。私が読んだところでは、32ビットDLLを64にロードしようとしています。 - ビットアプリ。しかし、何度も何度もチェックしたところ、クラスライブラリはx86
に設定され、そのクラスライブラリの呼び出しを行うコンソールアプリケーションはx86
に設定されています。
他のDLLファイルも同じベンダーから読み込めます(これも32ビットです)。
これは私のネイティブヘルパークラスである:
class NativeHelper
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryEx", SetLastError = true)]
public static extern IntPtr LoadLibraryEx(string dllToLoad, IntPtr hFile, LoadLibraryFlags flags);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
[System.Flags]
public enum LoadLibraryFlags : uint
{
DONT_RESOLVE_DLL_REFERENCES = 0x00000001,
LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010,
LOAD_LIBRARY_AS_DATAFILE = 0x00000002,
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040,
LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020,
LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008,
LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100,
LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800,
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000
}
}
そして、これは私がコールさせる方法です。
IntPtr pDll = NativeHelper.LoadLibrary(@"dhplay.dll"); // returns 0
if (pDll == IntPtr.Zero)
{
var err = Marshal.GetLastWin32Error().ToString(); // returns 193
Console.WriteLine(err);
}
を、私はここで何をしないのですか?私が実行している場合x86
なぜDLLはロードされていないのですか?
編集(追加情報):
IntPtr.Size
は4
dumpbin
戻り8664 machine (x64)
である - それは、64ビットのです意味?私は使用されている他のDLLを確認したと彼らは8664 machine (x86)
限り、それは私のマシン上のVCAアプリケーションで動作している。
'IntPtr.Size'を印刷してみてください... – xanatos
その後、' dumpbin'を使います(Visual Studioのコマンドプロンプトを使用する場合はパスに入れてください): 'dumpbin/headers yourdll.dll |もっと '。最初の行の1つは 'machine(x86/x64)' – xanatos
でなければなりません。もう一つの可能性があります:dllにいくつかの依存関係がありません... http://www.dependencywalker.com/を使ってdllが使用するdllとそれらがインストールされていることを確認してください。おそらくあなたのdllはあなたのPCにない特定のバージョンのMSVCRTを使用しています。 – xanatos