Я провел целый день в своей жизни, решая эту проблему, и я не хочу, чтобы кто-то другой делал то же самое.Итак, вот и проблема, и решение:
Проблема : вы получаете исключение PInvokeStackImbalance при попытке использовать методы в DLL C ++ в вашем коде C #.Вот типичное объявление, которое вы видите в примерах ...
Пример, который не работает
(C++ .h file)
extern "C" {
__declspec(dllexport) int Addints(int a, int b);
}
(C++ .cpp file)
extern int Addints(int a, int b) {
return a+b;
}
(C# .cs file)
[DllImport("testdll.dll")]
static extern int Addints(int a, int b);
static void Main(string[] args)
{
Console.WriteLine("Hello world lets add some stuff");
Int32 a = 3;
Int32 b = 5;
Console.WriteLine(Addints(a,b));
}
Когда вы запускаете это, он жалуется, что выразбалансируйте стек (на нет!) и что вам действительно не следует продолжать.Это также говорит о том, что вы должны проверить подпись вашего метода, чтобы убедиться, что они совпадают.
Ложь всякая ложь.
Исправление : Вам нужно добавить одну ~ крошечную вещь в выражение DLLImport, например:
Это исправление
[DllImport("testdll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int Addints(int a, int b);
Да, это вещь CallingConvention?Reeeeeeeeeeealy важно.
Несколько других советов:
- Убедитесь, что вы создаете как dll, так и C # exe для одной и той же цели.Win32 и x86 (например) соответственно
- Убедитесь, что ваша dll собрана с параметром / clr (Свойства проекта - Свойства конфигурации - Общие)
- Имейте в виду, что ваши C ++ int, float, string могут не бытьтот же размер на другой стороне границы (проверьте здесь , чтобы увидеть, как типы совпадают)
- И для действительно хорошего пошагового примера проверьте programmersnotebook.wordpress.com/2010/01/ 18 / призвание-а-каст-длл-из-сСта