У меня очень простая функция в неуправляемой DLL, но я не получаю правильное возвращаемое значение из нее.
Я могу подтвердить, что общий механизм PInvoke работает с одной функцией в моей C DLL:
/* Return an integer */
extern "C" __declspec(dllexport) long get_num()
{
return 42;
}
Я называю вышеупомянутую неуправляемую точку входа из C # .NET:
[DllImport("My_C_DLL.dll")]
extern static long get_num();
// ...
long ans = get_num();
Console.WriteLine("The answer is {0}.", ans);
Это работает нормально, но передача параметров маршалирования другой функции в DLL возвращает неверный результат:
/* Add two integers */
extern "C" __declspec(dllexport) long add_num(long a, long b)
{
long sum = a + b;
return sum;
}
Вызывается из C # как:
[DllImport("My_C_DLL.dll")]
extern static long add_num(long a, long b);
long a = 6, b = 12;
long sum = add_num(a, b);
Console.WriteLine("The answer is {0}.", sum);
Это возвращает мне результат «6», или что бы я ни установил для входного значения a .
Я предполагаю, что неправильное распределение входных значений портит стек вызовов, что приводит к неверному возвращаемому значению, но где ошибка?