平台选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的源码