DLLImport в WPFApp не работает (PInvokeStackImbalance) - PullRequest
0 голосов
/ 16 июня 2020

Я создал два приложения 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);

1 Ответ

0 голосов
/ 16 июня 2020

Попробуйте использовать точное объявление из pinvoke. net:

[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern IntPtr CreateFileA(
    [MarshalAs(UnmanagedType.LPStr)] string filename,
    [MarshalAs(UnmanagedType.U4)] FileAccess access,
    [MarshalAs(UnmanagedType.U4)] FileShare share,
    IntPtr securityAttributes,
    [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
    [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
    IntPtr templateFile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...