Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# WPFApp中的DLLImport不工作(PINVOKESSTACK不平衡)_C#_Wpf - Fatal编程技术网

C# WPFApp中的DLLImport不工作(PINVOKESSTACK不平衡)

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

我创建了两个C#应用程序,一个是WPF应用程序,另一个是控制台应用程序。两者都有相同的代码(我创建了控制台应用程序来测试C#代码,并复制到真实的应用程序中,即WPF应用程序)

我正在使用的DLLImport如下所示:

[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声明修复了它。