У меня есть C dll с какой-то сложной структурой, и я действительно новичок в C #:
typedef struct {
int a;
int b;
} simple_struct;
typedef struct {
int d;
int e;
simple_struct f[20];
short g;
simple_struct h[20];
short i;
} complex_struct;
Проблема в том, что я не могу связать свое приложение C # с этой структурой !!
В DLL есть функция GetData (complex_struct * myStruct), и я должен вызвать ее из C #, поэтому я создал:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct simple_struct {
public int a;
public int b;
} ;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct complex_struct {
public int d;
public int e;
public simple_struct[] f;
public short g;
public simple_struct[] h;
public short i;
} ;
, но проблема в том, что когда я передаю complex_struct в качестве аргумента GetDataвсе поля заполнены обратно от меня, но не мои два массива simple_struct (я имею в виду f и h) !!Их значения равны нулю !!
Может кто-нибудь помочь мне, пожалуйста, спасибо
Привет и спасибо за ваш ответ,
Я сделал так, как вы сказали,но у меня все еще есть другая проблема, когда я вызываю GetData, процесс завершается сбоем без какого-либо сообщения (своего рода исключение):
Это мой код C sharp: namespace dll_test_import_c_sharp {class Program {{StructLayout (LayoutKind.Sequential,Pack = 1)] struct simple_struct {public int a;public int b;};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct complex_struct {
public int d;
public int e;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] f;
public short g;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] h;
public short i;
} ;
[DllImport("test_dll.dll", CharSet = CharSet.Unicode)]
static extern int GetData(ref complex_struct a);
static void Main(string[] args)
{
complex_struct a = new complex_struct();
GetData(ref a);
return;
}
}
}
Я выполнил много функций printf i GetData, и все они хорошо выполнены, похоже, что инструкция 'return' не работает !!
Я пытался вызвать GetData по ref или out, и оба они не работают ...
Привет и спасибо за ваш ответ,
Iсделали так, как вы сказали, но у меня все еще есть другая проблема, когда я вызываю GetData, процесс завершается сбоем без какого-либо сообщения (своего рода исключение):
Это мой C-код: пространство имен dll_test_import_c_sharp {class Program {[StructLayout (LayoutKind.Sequential, Pack = 1)] struct simple_struct {public int a;public int b;};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct complex_struct {
public int d;
public int e;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] f;
public short g;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public simple_struct[] h;
public short i;
} ;
[DllImport("test_dll.dll", CharSet = CharSet.Unicode)]
static extern int GetData(ref complex_struct a);
static void Main(string[] args)
{
complex_struct a = new complex_struct();
GetData(ref a);
return;
}
}
}
Я выполнил много функций printf i GetData, и все они хорошо выполнены, похоже, что инструкция 'return' не работает !!
Я пытался вызвать GetData по ref или out, и оба они не работают ...