2017-04-13 17 views
-1

私が作業しているベンダーから提供されたサードパーティの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アプリケーションで動作している。

+0

'IntPtr.Size'を印刷してみてください... – xanatos

+0

その後、' dumpbin'を使います(Visual Studioのコマンドプロンプトを使用する場合はパスに入れてください): 'dumpbin/headers yourdll.dll |もっと '。最初の行の1つは 'machine(x86/x64)' – xanatos

+0

でなければなりません。もう一つの可能​​性があります:dllにいくつかの依存関係がありません... http://www.dependencywalker.com/を使ってdllが使用するdllとそれらがインストールされていることを確認してください。おそらくあなたのdllはあなたのPCにない特定のバージョンのMSVCRTを使用しています。 – xanatos

答えて

0

煙がある場合、火災が発生することがよくあります。あなたのアプリがx32(またはその逆)の間、dllの中におそらくx64があります。

  • チェックインアプリIntPtr.Size 4→x86、32ビット、8→x64,64ビット

  • Visual Studioコマンドプロンプトを使用する場合、dumpbinを使用できるはずです。あなたのdllのためにdumpbin /headers yourdll.dll | moreをしてください。最初の行の1つはmachine (...)です。それは2番目の質問へのx86(その32ビット)またはx64(そう64ビット)

がある場合(...)でそれが書かれるべき、することができますではない任意の方法ミックスで32ビットおよび64ビットのDLL単一プロセス。いくつかのプログラムは、 "欺く"とdllをロードして、プライマリプロセスと二次プロセス間のIPC(プロセス間通信)dllを使用する正しいビットを持つ二次プロセスを作成します。明らかにそれは複雑です。

関連する問題