Я просто переключился на vs2010 из vs2008. Точное одно и то же решение, за исключением того, что каждый раз каждый вызов в С++ dll дает исключение "pinvokestackimbalance".
Это исключение не запускается в 2008 году. У меня есть полный доступ к dll С++ и вызывающему приложению. Там нет никаких проблем с pinvoke, но эта проблема делает невозможным отладку других проблем; IDE постоянно останавливается, чтобы рассказать мне об этих вещах.
Например, здесь подпись С#:
[DllImport("ImageOperations.dll")]
static extern void FasterFunction(
[MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage,
[MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage,
int inTotalSize, int inWindow, int inLevel);
Вот как это выглядит на стороне С++:
#ifdef OPERATIONS_EXPORTS
#define OPERATIONS_API __declspec(dllexport)
#else
#define OPERATIONS_API __declspec(dllimport)
#endif
extern "C" {
OPERATIONS_API void __cdecl FasterFunction(unsigned short* inArray,
unsigned char* outRemappedImage,
int inTotalSize,
int inWindow, int inLevel);
}
Чем отличаются vs2010 и vs2008, которые могут вызвать выброс этих исключений? Должен ли я добавлять другой набор параметров в директиву DllImport?