Hey! Acabo de empezar a jugar con Pinvoke y he encontrado un problema. Obtengo la AccessViolationException. Antes que nada, ¿hay alguna forma de depurar o rastrear qué campo está causando este error? Lo único que se escribe es el resultado struct.Pinvoke struct que necesita la ayuda necesaria - System.AccessViolationException
El c llamada ++ parece:
MyFunc(int var1, _tuchar *var2, _tuchar *var3, _tuchar *var4, MyStruct *Result,
_tuchar *var5, _tuchar *var6);
La estructura C++:
typedef struct MyStruct
{
_tuchar *id;
_tuchar *ErrorMessages;
int int1;
_tuchar language[3];
_tuchar *result;
int type;
int number;
int *type2;
_tuchar **blocks;
}
El C# estructura:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.LPStr)]
public string Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=500)]
public char[] ErrorMessages;
public int int1;
[MarshalAs(UnmanagedType.LPStr)]
public string language;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
public char[] result;
public int type;
public int number;
public int type2;
[MarshalAs(UnmanagedType.ByValArray)]
public string[] blocks;
La declaración de C# método:
[DllImport(MyPath, EntryPoint = "MyEntryPoint", SetLastError = true,
CharSet = CharSet.Unicode)]
internal static extern int MyFunc(int var1, string var2, string var3,
string var4, ref MyStruct Result, string var5, string var6);
El C# Llamada:
var result = new MyStruct();
MyFunc(0, "var2", "var3", "var4", ref result, "var5", "var6");
espero no haber dejado nada fuera. ¡Gracias por cualquier ayuda!
¿Cómo se ve la declaración 'MyFunc' en C#? – Justin
ah ofc olvidé algo, gracias amigo ^^ – Dashu
¿El tamaño de 'int' en C++ garantiza ser de 32 bits/convertible con System.Int32? System.Int32 tiene una garantía muy precisa, incluso en bit-ness. –