Я создал два приложения 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);
В консольном приложении код работает отлично, но в приложении WPF я получаю следующую ошибку:
Помощник по управляемой отладке 'PInvokeStackImbalance': 'Вызов функции PInvoke' WpfApp1! WpfApp1.Class1 :: CreateFileA 'разбалансировал стек. Вероятно, это связано с тем, что подпись управляемого PInvoke не соответствует подписи неуправляемого целевого объекта. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи. '
Я попытался изменить соглашение о вызовах, но ошибка не изменилась. Почему это работает в консольном приложении, но не в приложении WPF?
EDIT: теперь такая же ошибка возникает для VirtualProtect:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool VirtualProtect(IntPtr lpAddress, uint dwSize, long flNewProtect, out IntPtr lpflOldProtect);