Возврат массива структур из неуправляемой функции C ++ в C # - PullRequest
0 голосов
/ 21 ноября 2018

В настоящее время я работаю над групповым проектом, где кроме графического интерфейса, который выполняется на C #, весь код выполняется на C ++.

В C ++ мы используем функцию, которая читает форматированный текст из файла.и разделяет его на массив структур, пример структуры:

typedef struct example{
    string id;
    string name;
    string email;
    char status;
    string phone_number;
 }example;

И массива:

example* example_arr=new example[10];

Затем мы хотим вернуть этот массив из функции C ++и использовать его в C # (DLLImport), чтобы отобразить эту информацию в форме.

Когда я начал думать о реализации части C #, я понял, что почти ничего не понимаю о том, как подойти к нему, так как я 'Я никогда не видел, чтобы неуправляемая память использовалась в C #, поэтому я начал искать возможные решения, но большинство случаев, которые я обнаружил, касались отправки информации в противоположном направлении (от C # до C ++) или были довольно неясны в их объяснении.Единственное, что я получил от них на самом деле, это то, что концепция маршаллинга может быть полезной, однако, я не могу по-настоящему обдумать это.

Я был бы искренне признателен за любую помощь по этой теме, я действительнохочу, чтобы это произошло, хотя у меня нет опыта работы с неуправляемой памятью в C #.

РЕДАКТИРОВАТЬ:

Я пытался реализовать то, что предложил Ганс, но я 'столкнулся с проблемой.Код C # запускается, выполняет функцию C ++, которая также работает до тех пор, пока не доберется до оператора return, и просто останавливается (не ломается / выбрасывает, просто замирает, как будто ожидает чего-то происходящего), что в свою очередь останавливает продолжение кода C #он запущен.

Это код (я упростил структуру для тестирования):

C ++

///header file
typedef struct example
{
    int num;
    char str[5];
}example;

extern "C" __declspec(dllexport) int __stdcall test(a arr[],int len);

///Cpp file
int __stdcall test(example* arr,int len)
{
    for (int i = 0; i < len; i++)
    {
        arr[i].num = i;
        std::cout <<"arr["<<i<<"].num = "<< arr[i].num<<"\n";//for debugging purposes
        strcpy(arr[i][0].str, "test");
    }
    std::cout << "not yet\n";
    return -1;//*does not get executed*
}

C #

public partial class Form1 : Form
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct example
    {
        public int num;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
        public string str;
    };

    [DllImport("unmanaged.dll", CallingConvention=CallingConvention.StdCall)]
    public static extern int test(out example[] arr,int len);

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)//Form Loaded Event function
    {
        example[] arr = new example[10];
        int res = test(out arr,10);//*Code freezes here*

        Debug.WriteLine(res);
        _text.Text =arr[0].str;
    }
}

Вывод в окне отладки (должен заканчиваться -1, если все работает):

arr[0].num = 0
arr[1].num = 1
arr[2].num = 2
arr[3].num = 3
arr[4].num = 4
arr[5].num = 5
arr[6].num = 6
arr[7].num = 7
arr[8].num = 8
arr[9].num = 9
not yet

Я нахожу это действительно странным, это может быть какая-то механика, связанная с модификатором [out], но яПонял не ключ.

...