Por lo tanto, ha habido muchas variantes de esta pregunta, y después de ver varias todavía no puedo entenderlo.C# llamando a la función C que devuelve struct con arreglo de caracteres de tamaño fijo
Este es el código C:
typedef struct
{
unsigned long Identifier;
char Name[128];
} Frame;
Frame GetFrame(int index);
Este es el código 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);
Este es el último intento he intentado en C#, y parece bastante lógico, pero me da la error "La firma del método no es compatible con Invoke". Por lo tanto, estoy perdido en qué probar a continuación. Cualquier ayuda es apreciada.
Gracias, Kevin
ActualizadoKevin añadió esto como una edición de mi respuesta
Debería vez cambiar mi código C:
void GetFrame(int index, Frame * f);
y usar en su lugar para 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);
¿Has visto este http://social.msdn.microsoft.com/Forums/en-AU/csharplanguage/thread/6e0ad208-5c8b-48ac-a45e-cfaf7f52221b? – MilkyWayJoe
La definición de la función existe. El código C listado solo es del archivo de encabezado. –
Vi eso y probé el intPtr GetFrame externo estático (índice int); pero al llamar eso arroja el error "Intentó leer o escribir en la memoria protegida". –