У меня есть программа на C #, которая вызывает родную C ++ dll.
C # имеет следующую структуру:
[StructLayout(LayoutKind.Sequential)]
public struct Phenomenon
{
[MarshalAs(UnmanagedType.U1)] public char Type;
[MarshalAs(UnmanagedType.R8)] public double Jd;
[MarshalAs(UnmanagedType.R8)] public double Loc_jd;
[MarshalAs(UnmanagedType.R8)] public double Angle;
[MarshalAs(UnmanagedType.U1)] public char Tran_dir;
[MarshalAs(UnmanagedType.I2)] public Int16 Warning;
}
Программа на C ++ имеет следующее определение структуры:
typedef struct
{
char type;
double jd;
double loc_jd;
double angle;
char tran_dir;
short int warning;
} phenomenon;
Программа C # создает экземпляры объектов Phenomenom и имеет следующий вызов метода C ++:
Phenomenon[] phenomena = new Phenomenon[6];
short status = rsttwi_temp(phenomena);
C ++ просто обновляет структуру и возвращает. Вот функция C ++:
__declspec(dllexport) short int rsttwi_temp (phenomenon phen[1])
{
phen[0].type = 'Z';
phen[0].jd = 1.1;
phen[0].loc_jd = 2.2;
phen[0].angle = 3.3;
phen[0].tran_dir = 4.4;
phen[0].warning = '0';
return 0;
}
Из программы C #, когда я распечатываю значения структуры после вызова функции C ++, структура не обновлялась (то есть она такая же, как до вызова функции C ++). Кажется, что программа C ++ может видеть значения и обновлять их, но по возвращении C # никогда не видит обновлений значений в структуре. Думая, что это проблема соотношения стоимости и ссылки, я даже попытался сделать это с помощью класса в программе на C # вместо структуры. Все еще не повезло.
Вопрос:
Какой маршалинг мне нужен, чтобы вызываемая функция C ++ могла обновлять фактическую структуру, которая была ей передана?
Спасибо.
Грег Эдвардс
Total Immersion Software