Вызов C ++ DLL из C # внутри VS завершается неудачно. Запустите exe за пределами VS, и это работает

У меня есть C ++ DLL, которая вызывается, как показано ниже, из консольного приложения C #.

При запуске в Visual Studio для его отладки выдается исключение, сообщающее, что стек нестабилен, и для проверки правильности аргументов метода. Однако, если я запускаю * .exe вне VS из Проводника Windows, он возвращает данные на экран, как и ожидалось.

Как я могу заставить это работать в Visual Studio?

Спасибо

**From the C++ header file:**
#ifdef RFIDSVRCONNECT_EXPORTS
#define RFID_CONN_API __declspec(dllexport)
#else
#define RFID_CONN_API __declspec(dllimport)
#endif

RFID_CONN_API BSTR rscListDevices( long showall ) ;[DllImport("MyDLL.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string rscListDevices(int showall);

static void Main(string[] args)
{
string data= rscListDevices(0);
Console.WriteLine(data);
Console.ReadKey();
}

1

Решение

Во-первых, убедитесь, что вы используете одно и то же соглашение о вызовах в обоих C ++ а также C #.

Я подозреваю, что /Gd опция компилятора установлена ​​(так как она установлена ​​по умолчанию), поэтому __cdecl используется в качестве соглашения о вызовах по умолчанию для неотмеченных функций.

Вы можете исправить сбои, указав одно и то же соглашение о вызовах в коде C #:

[DllImport("MyDLL.dll", CallingConvention=CallingConvention.Cdecl))]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string rscListDevices(int showall);

Или меняется rscListDevicesсозывает конвенцию __stdcall (который используется по умолчанию в C #):

RFID_CONN_API BSTR __stdcall rscListDevices( long showall ) ;

Вы также можете установить __stdcall как соглашение о вызовах по умолчанию для неотмеченных функций в вашей C ++ DLL путем изменения параметра компилятора с / Gd на / Gz вручную или с помощью диалога свойств проекта:
изменение соглашения о вызовах по умолчанию в Visual Studio

Но если ты действительно Если вы хотите отключить MDA, вы можете перейти к Debug-> Exceptions и снять флажок Managed Debugging Assistance.

Вы можете прочитать больше о pInvokeStackImbalance и MDA Вот а также Вот.

3

Другие решения

Других решений пока нет …