2016-08-04 7 views
1

У меня есть функция, написанная на 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); 
+0

Ваш заголовок имеет 'bisection', возвращающий' double', в то время как реализация возвращает 'Result'. – PaulMcKenzie

+0

Ах! Ошибка, когда я редактировал свой код для публикации здесь. Я исправил это. – Aeleon

+0

Возможно, было бы лучше передать результат как параметр out вместо его возвращения, а код C++ заполнить «Result» в том, что он передан. Это будет следовать в модели того, как вы называете функции Windows API, которые должны «возвращать структуру» (например, «GetMessage») – PaulMcKenzie

ответ

1

Ваш код почти правильно. Существует несоответствие вызова конвенции. Код C++ использует cdecl, C# stdcall. Измените его так, чтобы они совпадали.

+0

Да, это было; это то, что он сделал. Я скопировал код из нескольких онлайн-источников, и я, должно быть, испортил его во время редактирования, чтобы соответствовать моим потребностям. Я читал на вызывающем соглашении и по умолчанию был stdcall; как только я изменил это, в соответствии с вашими инструкциями, код работал. благодаря – Aeleon

Смежные вопросы