Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的LoadLibrary使用GetErrorLast显示恼人的错误对话框_C#_.net Core 3.1_Loadlibrary_Kernel32_.net 4.8 - Fatal编程技术网

C#中的LoadLibrary使用GetErrorLast显示恼人的错误对话框

C#中的LoadLibrary使用GetErrorLast显示恼人的错误对话框,c#,.net-core-3.1,loadlibrary,kernel32,.net-4.8,C#,.net Core 3.1,Loadlibrary,Kernel32,.net 4.8,我有一个小项目,我想批量加载注册表中引用的一些库来读取一些资源。我在加载库C:\Windows\System32\mmsys.cpl时遇到了问题,它似乎有错误。错误本身不是问题所在,但我想阻止显示任何本机错误对话框。我只想将本机代码中的异常重定向到托管代码的异常。我已经用.NETFramework4.8和.NETCore3.1以及内核32中的LoadLibrary和LoadLibraryEx对此进行了测试,但没有成功。我已经测试了其他*.cpl库,它们的加载情况良好 预期: 加载此库会在托管代码

我有一个小项目,我想批量加载注册表中引用的一些库来读取一些资源。我在加载库C:\Windows\System32\mmsys.cpl时遇到了问题,它似乎有错误。错误本身不是问题所在,但我想阻止显示任何本机错误对话框。我只想将本机代码中的异常重定向到托管代码的异常。我已经用.NETFramework4.8和.NETCore3.1以及内核32中的LoadLibrary和LoadLibraryEx对此进行了测试,但没有成功。我已经测试了其他*.cpl库,它们的加载情况良好

预期: 加载此库会在托管代码中引发异常-不显示任何错误对话框

实际: 加载此库会显示此恼人的对话框,并在托管代码中引发异常

[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
private static extern System.IntPtr LoadLibrary(string lpFileName);

private static void Main(string[] args)
{
  var resource = @"C:\Windows\System32\mmsys.cpl";
  // var resource = @"C:\Windows\System32\timedate.cpl";
  var lib = LoadLibrary(resource);
  if (lib == System.IntPtr.Zero)
  {
    var errorCode = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
    throw new System.SystemException($"System failed to load library '{resource}' with error {errorCode}");
  }
}
错误对话框:

更新:

这段代码现在适用于我:

[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
private static extern System.IntPtr LoadLibrary(string lpFileName);

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern ErrorModes SetErrorMode(ErrorModes uMode);

[System.Flags]
public enum ErrorModes : uint
{
  SYSTEM_DEFAULT = 0x0,
  SEM_FAILCRITICALERRORS = 0x0001,
  SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
  SEM_NOGPFAULTERRORBOX = 0x0002,
  SEM_NOOPENFILEERRORBOX = 0x8000
}


private static void Main(string[] args)
{
  SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS);
  var resource = @"C:\Windows\System32\mmsys.cpl";
  // var resource = @"C:\Windows\System32\timedate.cpl";
  var lib = LoadLibrary(resource);
  if (lib == System.IntPtr.Zero)
  {
    var errorCode = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
    throw new System.SystemException($"System failed to load library '{resource}' with error {errorCode}");
  }
}
您需要首先使用SEM_NOOPENFILEERRORBOX(0x8000)调用

有关详细信息,请参见中的备注部分:

要启用或禁用加载程序在加载DLL期间显示的错误消息,请使用SetErrorMode函数


,另请参阅。非常感谢您的快速回答。这是非常接近,但非常有帮助。