У меня есть функция, написанная на C++, которую я положил в dll и использую в C# с помощью DllImport. Все работает; Я могу получить возвращаемое значение из C++ и отобразить его в моем графическом интерфейсе C#. Теперь я хочу добавить к этой функции и вернуть ей несколько значений (3 пока). Я пробовал методы, приведенные в Return C++ array to C# и How to return two different variable in c++?, но не работает. Код из первого сообщения дает мне ошибку нарушения прав доступа, а вторая форма кода дает мне все 0 значений для структуры. Для первого я даже точно скопировал данный код и попытался запустить его, но безрезультатно. Что может быть причиной ошибок и неправильных значений, данных этими методами? Как я могу заставить их работать?возвращающие массивы и структуры из функции C++ в C#
На всякий случай это необходимо, мой собственный код с выполнением второго сообщения ниже.
bisection.h
struct Result
{
double root;
double relError;
double absError;
}result;
extern "C" {__declspec(dllexport) Result bisection(double l, double u, double stoppingError, int maxIter); }
bisection.cpp
Result bisection(double l, double u, double stoppingError, int maxIter) {
//code for this function
result.root = xr;
result.relError = e;
result.absError = 1;
return result;
}
C# код
[StructLayout(LayoutKind.Sequential)]
public struct Result
{
public double root;
public double relError;
public double absError;
}
[DllImport(dllPath)]
private static extern Result bisection(double l, double u, double stoppingError, int maxIter);
Result result = bisection(data[0], data[1], 0.1, 100);
Ваш заголовок имеет 'bisection', возвращающий' double', в то время как реализация возвращает 'Result'. – PaulMcKenzie
Ах! Ошибка, когда я редактировал свой код для публикации здесь. Я исправил это. – Aeleon
Возможно, было бы лучше передать результат как параметр out вместо его возвращения, а код C++ заполнить «Result» в том, что он передан. Это будет следовать в модели того, как вы называете функции Windows API, которые должны «возвращать структуру» (например, «GetMessage») – PaulMcKenzie