В настоящее время я работаю над групповым проектом, где кроме графического интерфейса, который выполняется на 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], но яПонял не ключ.