kernel32.dll中的LoadLibrary函数在Asp Web应用程序中返回零

时间:2014-03-13 15:11:03

标签: c# asp.net

我将在asp.net web应用程序中使用kernel32 dll。这是代码: // DllGetClassObject函数指针签名     private delegate int DllGetClassObject(ref Guid ClassId,ref Guid InterfaceId,[Out,MarshalAs(UnmanagedType.Interface)] out object ppunk);

//Some win32 methods to load\unload dlls and get a function pointer
private class Win32NativeMethods
{
  [DllImport("kernel32.dll", CharSet=CharSet.Ansi)]
  public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

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

  [DllImport("kernel32.dll")]
  public static extern IntPtr LoadLibrary(string lpFileName);
}
public string GetTheDllHandle (dllName)
{
    IntPtr dllHandle = Win32NativeMethods.LoadLibrary(dllName); // the dllHandle=IntPtr.Zero
    return dllHandle.ToString();
}

当我调用我的函数GetTheDllHandle时,dllHandle返回零的问题

那里的人有类似的东西吗?或者有人有任何建议吗?

2 个答案:

答案 0 :(得分:10)

在加载DLL时返回0是由于几个原因,例如,DLL不在指定的路径上,或者平台不支持DLL,或者在构建本机DLL之前未加载相关的dll。因此,您可以通过为SetLastError属性

设置true来跟踪这些错误
DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
public static extern IntPtr LoadLibrary(string lpFileName);
public string GetTheDllHandle (dllName)
{
   IntPtr dllHandle = Win32NativeMethods.LoadLibrary(dllName); // the dllHandle=IntPtr.Zero

   if (dllHandle == IntPtr.Zero)
      return Marshal.GetLastWin32Error().ToString(); // Error Code while loading DLL
   else
      return dllHandle.ToString();  // Loading done !
}

答案 1 :(得分:0)

我在asp.net Web应用程序中遇到kernel32.dll的相同问题。 LoadLibrary返回,而GetLastWin32Error()返回 127

就我而言,问题是平台不支持DLL 。我在64位Windows Server上运行64位模式IIS网站。 Dll与x64不兼容。然后,启用32位asp.net IIS集成并进行编译,以32位模式发布,此问题已解决。