C#在64位程序上获取LoadLibraryA返回0

平台选x86时正常运行
选x64时if (loadaddr == 0)就return了

[DllImport("kernel32.dll")]
        public static extern int GetProcAddress(int hwnd, string lpname);

        [DllImport("kernel32.dll")]
        public static extern int GetModuleHandleA(string name);

var kernel32 = GetModuleHandleA("kernel32.dll");
if (kernel32 == 0)
{
        Console.WriteLine("GetModuleHandleA kernel32.dll failed!");
        return 1;
}
var loadaddr = GetProcAddress(kernel32, "LoadLibraryA");
if (loadaddr == 0)
{
         Console.WriteLine("GetProcAddress LoadLibraryA failed!");
         return 1;
}

dll引入声明错误,修改为:

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetProcAddress(IntPtr hwnd, string lpname);
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandleA(string name);
        private int test()
        {
            var kernel32 = GetModuleHandleA("kernel32.dll");
            if (kernel32 == IntPtr.Zero)
            {
                Console.WriteLine("GetModuleHandleA kernel32.dll failed!");
                return 1;
            }
            var loadaddr = GetProcAddress(kernel32, "LoadLibraryA");
            if (loadaddr == IntPtr.Zero)
            {
                Console.WriteLine("GetProcAddress LoadLibraryA failed!");
                return 1;
            }
            return 0;
        }

32位 换成 64位 用于C#开发内容的可能重复项
32位和64位应用程序只能加载相同位数的DLL。如果您的平台目标是"任何CPU",并且您引用或P /调用32位本机DLL,则对于托管项目来说这可能是个问题。当您的"任何CPU"程序在64位计算机上运行时,就会出现此问题,因为您的应用程序以64位进程运行。当它尝试加载32位本机DLL依赖项时,它将引发异常(BadImageFormatException)并可能崩溃。

为什么要用c#去调用GetProcAddress?


extern "C" __declspec(dllexport)

当选择 x64 平台时,如果看到 GetProcAddress 返回 0,这可能是因为代码使用了 32 位整数类型 (int) 来存储模块句柄和函数地址。但是,在 64 位平台上,这些值实际上是 64 位的,所以应该使用 64 位整数类型 (long) 来存储它们。

更改之后的代码如下:

[DllImport("kernel32.dll")]
public static extern long GetProcAddress(long hwnd, string lpname);

[DllImport("kernel32.dll")]
public static extern long GetModuleHandleA(string name);

var kernel32 = GetModuleHandleA("kernel32.dll");
if (kernel32 == 0)
{
        Console.WriteLine("GetModuleHandleA kernel32.dll failed!");
        return 1;
}
var loadaddr = GetProcAddress(kernel32, "LoadLibraryA");
if (loadaddr == 0)
{
         Console.WriteLine("GetProcAddress LoadLibraryA failed!");
         return 1;
}

这应该解决你遇到的问题,望采纳

检查下这2项:
1、检查路径问题
2、检查调用的动态库,查看dll的源码