C# PInvoke: внешний API C++ работает хорошо, когда я нажимаю «F5» для запуска в VS, но не могу работать снаружиC#

Место общения программистов C#
Ответить
Anonymous
 C# PInvoke: внешний API C++ работает хорошо, когда я нажимаю «F5» для запуска в VS, но не могу работать снаружи

Сообщение Anonymous »

Когда я нажимаю «F5» для запуска приложения C# в Visual Studio 2022, MDA предлагает PInvokeStackImbalance, но если я игнорирую MDA и нажимаю F5 для продолжения, все работает хорошо, C++ api возвращает 1.
Но если я запускаю свое приложение непосредственно в 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)
Мои коды C#:

Код: Выделить всё

        [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 — это сторонняя dll, и у меня есть только файл .h, поэтому я не могу напрямую отлаживать код C++.
Я пробовал для создания моего приложения 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»