Tak więc, było wiele wariantów tego pytania, a patrząc na kilka wciąż nie mogę tego rozgryźć.C# wywoływanie funkcji C, która zwraca struct z ustalonym rozmiarem tablicy znaków
Jest to kod C:
typedef struct
{
unsigned long Identifier;
char Name[128];
} Frame;
Frame GetFrame(int index);
Jest to kod C#:
struct Frame
{
public ulong Identifier;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 128)]
public char[] Name;
}
[DllImport("XNETDB.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern Frame GetFrame(int index);
Jest to ostatnia próba Próbowałem w C# i wydaje się całkiem logiczne, ale otrzymuję error "Sygnatura metody nie jest zgodna z PInvoke." Tak, jestem trochę zagubiony w tym, co spróbować dalej. Każda pomoc jest doceniana.
Dzięki, Kevin
UpdatedKevin dodaje to jako edycja na moją odpowiedź
Powinienem zamiast zmiana kodu C:
void GetFrame(int index, Frame * f);
i używać zamiast C# :
struct Frame
{
public uint Identifier;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Name;
}
[DllImport("XNETDB.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern void GetFrame(int index, ref Frame f);
Widziałeś ten http://social.msdn.microsoft.com/Forums/en-AU/csharplanguage/thread/6e0ad208-5c8b-48ac-a45e-cfaf7f52221b? – MilkyWayJoe
Definicja funkcji istnieje. Podany kod C jest tylko z pliku nagłówkowego. –
Widziałem to i próbowałem prywatnego statycznego rozszerzenia IntPtr GetFrame (indeks int); ale wywołanie, które wyrzuca błąd "Próba odczytu lub zapisu chronionej pamięci." –