C# WPFApp中的DLLImport不工作(PINVOKESSTACK不平衡)
我创建了两个C#应用程序,一个是WPF应用程序,另一个是控制台应用程序。两者都有相同的代码(我创建了控制台应用程序来测试C#代码,并复制到真实的应用程序中,即WPF应用程序) 我正在使用的DLLImport如下所示:C# WPFApp中的DLLImport不工作(PINVOKESSTACK不平衡),c#,wpf,C#,Wpf,我创建了两个C#应用程序,一个是WPF应用程序,另一个是控制台应用程序。两者都有相同的代码(我创建了控制台应用程序来测试C#代码,并复制到真实的应用程序中,即WPF应用程序) 我正在使用的DLLImport如下所示: [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr CreateFileA(string lpFileName, long dwDesiredAccess, uint dwShar
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr CreateFileA(string lpFileName, long dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
Process process = Process.GetCurrentProcess();
ModuleInformation mi = new ModuleInformation();
IntPtr dllModule = GetModuleHandleA(dllName);
GetModuleInformation(process.Handle, dllModule, out mi, (uint)(IntPtr.Size * 3));
IntPtr baseAddress = mi.lpBaseOfDll;
IntPtr dllFile = CreateFileA(dllPath, 0x80000000L, 1, 0, 3, 0, (IntPtr)0);
并在如下代码中被调用:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr CreateFileA(string lpFileName, long dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
Process process = Process.GetCurrentProcess();
ModuleInformation mi = new ModuleInformation();
IntPtr dllModule = GetModuleHandleA(dllName);
GetModuleInformation(process.Handle, dllModule, out mi, (uint)(IntPtr.Size * 3));
IntPtr baseAddress = mi.lpBaseOfDll;
IntPtr dllFile = CreateFileA(dllPath, 0x80000000L, 1, 0, 3, 0, (IntPtr)0);
在控制台应用程序中,代码运行良好,但在WPF应用程序中,我收到以下错误:
托管调试助手“PinvokeStackDistancement”:“调用PInvoke函数”WpfApp1!WpfApp1.Class1::CreateFileA'使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。'
我试图改变呼叫约定,但错误没有改变。为什么它在控制台应用程序中工作,而在WPF应用程序中不工作
编辑:
现在,VirtualProtect也会发生同样的错误:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool VirtualProtect(IntPtr lpAddress, uint dwSize, long flNewProtect, out IntPtr lpflOldProtect);
尝试从以下位置使用确切的声明:
这成功了,谢谢!不过,我现在对VirtualProtect也有同样的问题……我编辑了最初的问题,以便您可以查看代码。我在pinvoke上搜索了另一个声明,但找不到它。不过,用VirtualProtectEx声明修复了它。