2016-07-21 16 views
0

Ich bin eine Web-API Asp.Net 4.6 App läuft in jedem CPU-Modus ausgeführt (obwohl ich auch dies unter Angabe x64 versucht) und es ruft eine nicht verwaltete x64 C-DLL. Dies funktioniert einwandfrei, wenn Sie in Visual Studio ausgeführt werden (mit den standardmäßigen IIS Express-Einstellungen), obwohl ich Windows-Fehler 126 (das angegebene Modul konnte nicht gefunden werden) bei der Bereitstellung auf einem anderen Server und in IIS oder IIS Express ausführen, obwohl ich mir sicher bin Der Pfad zur DLL ist korrekt. Gibt es noch etwas, das ich ausprobieren kann?App nicht gefunden unmanaged dll bei der Bereitstellung

My Native Methods Wrapper:

public static class NativeMethods 
{ 
    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)] 
    public static extern IntPtr LoadLibrary(string dllToLoad); 

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

    [DllImport("kernel32.dll")] 
    public static extern bool FreeLibrary(IntPtr hModule); 

    [DllImport("kernel32.dll", CharSet = CharSet.Ansi)] 
    public static extern IntPtr GetModuleHandle(string lpModuleName); 

    [DllImport("kernel32.dll")] 
    public static extern uint GetLastError(); 
} 

My Load DLL-Methode:

private static void LoadDll() 
    { 
     UnloadDLL(); //Unload the module first 

     if (string.IsNullOrEmpty(DllDirectory)) 
      throw new ApplicationException("DPI DLL directory not specified."); 

     if (!File.Exists(DllPath)) 
      throw new ApplicationException("Could not find DPI DLL."); 

     pDll = NativeMethods.LoadLibrary(DllPath); 
     //Fails Here 
     if (pDll == IntPtr.Zero) 
      throw new ApplicationException(string.Format("Failed to load library <{0}> (ErrorCode: {1})", DllPath, Marshal.GetLastWin32Error())); 
    } 

Lassen Sie mich wissen, ob ich irgendetwas anderes mehr klar, Dank machen!

+0

Verwenden Sie [Dependency Walker] (http://www.dependencywalker.com/), um die Liste der Abhängigkeiten des Moduls abzurufen (Modul mit Pfad DllPath). Überprüfen Sie auch, ob Sie Visual C++ Redistributable auf dem Server installieren müssen. –

+0

@ArtavazdBalayan Danke !! Ich habe Dependency Walker in der Vergangenheit benutzt, aber ich dachte nicht, es hier zu verwenden. Es stellte sich heraus, dass die DLL im Debug-Modus kompiliert wurde und nach Debug-Versionen der DLL suchte, die offensichtlich nicht auf dem Produktionsserver waren. Wenn Sie die Antwort erneut veröffentlichen möchten, nehme ich sie gerne an. Danke noch einmal. – ikenread

Antwort

0

Verwenden Sie Dependency Walker, um die Liste der Abhängigkeiten des Moduls abzurufen (Modul mit Pfad DllPath). Überprüfen Sie auch, ob Sie Visual C++ Redistributable auf dem Server installieren müssen.

Von ikenread: Sie müssen den nicht verwalteten DLL-Kompilierungsmodus überprüfen. Wenn es im Debug-Modus kompiliert wurde, wird es von Debug-Versionen von Visual C++ Redistributable-DLLs abhängig sein und sie werden (am wahrscheinlichsten) auf dem Produktionsserver fehlen.

Verwandte Themen