У меня есть 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();
}
Во-первых, убедитесь, что вы используете одно и то же соглашение о вызовах в обоих 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 вручную или с помощью диалога свойств проекта:
Но если ты действительно Если вы хотите отключить MDA, вы можете перейти к Debug-> Exceptions и снять флажок Managed Debugging Assistance.
Вы можете прочитать больше о pInvokeStackImbalance и MDA Вот а также Вот.
Других решений пока нет …