【发布时间】:2020-07-01 14:09:21
【问题描述】:
我尝试使用 LoadLibraryEx 函数加载xxx.dll。在 ASP.NET CORE Web - MVC 应用程序中。它可以返回正确的值。但在 ASP.NET Web - Web API 应用程序中。它返回0x00000000。但GetLastError() 返回0。这是我的演示代码
ASP.NET Web 中的代码 - Web API 应用程序
[DllImport("kernel32.dll")]
static extern uint GetLastError();
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryEx", SetLastError = true)]
private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
private static uint LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008;
private static void LoadWin32Library(string libPath)
{
IntPtr moduleHandle = LoadLibraryEx(libPath, IntPtr.Zero, LOAD_WITH_ALTERED_SEARCH_PATH);
uint code = GetLastError();
Console.WriteLine(code);
Console.WriteLine(moduleHandle);
if (moduleHandle == IntPtr.Zero)
throw new Win32Exception(Marshal.GetLastWin32Error());
}
// GET api/values
public IEnumerable<string> Get()
{
String lpFileName = "C:\\Program Files\\dotnet\\shared\\Microsoft.NETCore.App\\2.1.11\\System.dll";
LoadWin32Library(lpFileName);
return new string[] { "value1", "value2" };
}
ASP.NET CORE Web 中的代码 - MVC
[DllImport("kernel32.dll")]
static extern uint GetLastError();
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryEx", SetLastError = true)]
private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
private static uint LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008;
private static void LoadWin32Library(string libPath)
{
IntPtr moduleHandle = LoadLibraryEx(libPath, IntPtr.Zero, LOAD_WITH_ALTERED_SEARCH_PATH);
uint code = GetLastError();
Console.WriteLine(code);
Console.WriteLine(moduleHandle);
if (moduleHandle == IntPtr.Zero)
throw new Win32Exception(Marshal.GetLastWin32Error());
}
public string Index()
{
String lpFileName = "C:\\Program Files\\dotnet\\shared\\Microsoft.NETCore.App\\2.1.11\\System.dll";
LoadWin32Library(lpFileName);
return "This is my default action...";
}
事实上。这两段代码基本一样。但是结果完全不同。所以。如果有人可以帮助我?
【问题讨论】:
-
你为什么要在
System.dll上打电话给LoadLibrary?而且,您是否意识到您正在尝试将 .NET Core 版本的System.dll加载到 .NET Framework 应用程序中? -
这只是一个测试。它可以是任何其他 xxx.dll
-
您通常不使用
LoadLibrary加载托管DLL,而是以正常方式调用它们。您通常也不使用LoadLibrary加载非托管 DLL,而是使用 P/Invoke 调用它们(就像您正在调用LoadLibrary一样)。为什么你认为你要打电话给LoadLibrary -
我只想加载指定的动态链接库。我只想知道为什么结果完全不同。所以你能解释一下吗