部署时应用程序无法找到非托管 dll
App fails to find unmanaged dll when deployed
我正在 运行 网络 API Asp.Net 4.6 应用程序 运行 任何 CPU 模式(虽然我也试过这个指定x64) 并调用非托管 x64 C dll。当我在 Visual Studio 中 运行ning(使用默认的 IIS Express 设置)时,这工作正常,虽然我得到 Windows 错误 126(找不到指定的模块。)当我部署到另一台服务器和运行 在 IIS 或 IIS Express 中,即使我确信 DLL 的路径是正确的。还有什么我可以尝试的吗?
我的本地方法包装器:
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();
}
我的加载 DLL 方法:
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()));
}
让我知道是否可以让我更清楚,谢谢!
使用Dependency Walker 获取模块的依赖项列表(具有路径 DllPath 的模块)。还要检查您是否需要在服务器上安装 Visual C++ Redistributable。
By ikenread: 需要检查非托管DLL编译模式。如果它在调试模式下编译,它将依赖于调试版本的 Visual C++ Redistributable dll,并且它们将不存在(很可能)在生产服务器上。
我正在 运行 网络 API Asp.Net 4.6 应用程序 运行 任何 CPU 模式(虽然我也试过这个指定x64) 并调用非托管 x64 C dll。当我在 Visual Studio 中 运行ning(使用默认的 IIS Express 设置)时,这工作正常,虽然我得到 Windows 错误 126(找不到指定的模块。)当我部署到另一台服务器和运行 在 IIS 或 IIS Express 中,即使我确信 DLL 的路径是正确的。还有什么我可以尝试的吗?
我的本地方法包装器:
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();
}
我的加载 DLL 方法:
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()));
}
让我知道是否可以让我更清楚,谢谢!
使用Dependency Walker 获取模块的依赖项列表(具有路径 DllPath 的模块)。还要检查您是否需要在服务器上安装 Visual C++ Redistributable。
By ikenread: 需要检查非托管DLL编译模式。如果它在调试模式下编译,它将依赖于调试版本的 Visual C++ Redistributable dll,并且它们将不存在(很可能)在生产服务器上。