Но если я запускаю свое приложение непосредственно в Windows, исключение не появляется, и API возвращает 0.Платформа установлена на Выпуск — x86, и я подтвердил правильность папки.
Мой проект C# — .NET Framework 4.7.2, приложение winform.
Надеюсь, кто-нибудь поможет мне решить проблему с PInvokeStackImbalance. Я знаю, что ее исправление может привести к тому, что мое приложение будет работать за пределами VS.
И, что более важно, скажи мне почему «F5» в Visual Studio может работать, но не работать вне.
Определение API C++ (.h):
Код: Выделить всё
UPGRADE_API BOOL _stdcall WriteData(USHORT nID, BYTE dest, PBYTE pDataBuffer, USHORT nBufferSize, DWORD dwLayer=0);
//...
#define UPGRADE_API __declspec(dllimport)
Код: Выделить всё
[DllImport("Upgrade.dll", EntryPoint = "WriteData", CallingConvention = CallingConvention.StdCall)]
public static extern int WriteData(int id, byte dest, char[] data, int len);
//...
var resource = "Test";
var array = resource.ToCharArray();
var r = WriteData(33, 0, array, array.Length);
if (r == 0)
{
MessageBox.Show("Failed");
return;
}
MessageBox.Show($"Ok: {resource}");
Я пробовал для создания моего приложения C# с разбившимся API x64 и C++. И я построил отладку, то же самое, что и релиз.
Я проверил параметры запуска в VS, они пусты.
Я протестировал множество типов данных параметров API , например uint/ushort/short id, StringBuilder/string data, int/ushort len. Некоторые типы неверны, и даже «F5» в VS также возвращает 0. Но для всех этих типов всегда возникает PInvokeStackImbalance.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-vs-but
Мобильная версия