PInvoke hat den Stapel aus dem Gleichgewicht gebracht
Posted: 22 Dec 2024, 18:04
Ich versuche, eine C-DLL in einem C#-Projekt zu verwenden.
Ich habe eine Funktion in C:
extern __declspec(dllexport) void InitBoard(sPiece board[8][8]);
die sPiece-Struktur:
typedef struct Piece
{
ePieceType PieceType; //enum
ePlayer Player; //enum
int IsFirstMove;
} sPiece;
Ich habe PInvoke in C#:
[DllImport("chess_api.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern void InitBoard([MarshalAs(UnmanagedType.LPArray, SizeConst = 64)]ref sPiece[] board);
die sPiece-Struktur auf C#:
[StructLayout(LayoutKind.Sequential)]
public struct sPiece
{
public ePieceType PieceType;
public ePlayer Player;
public int IsFirstMove;
}
Wenn ich PInvoke ausführe, erhalte ich die folgende Fehlermeldung:
Ein Anruf Die PInvoke-Funktion „Chess!Chess.Main::InitBoard“ hat den Stapel aus dem Gleichgewicht gebracht. Dies liegt wahrscheinlich daran, dass die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur übereinstimmt. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Ich versuche, die Aufrufkonvention in Cdecl< zu ändern /code>, aber wenn ich es ausführe, bleibt der VS hängen.
Was soll ich tun?
Ich habe eine Funktion in C:
extern __declspec(dllexport) void InitBoard(sPiece board[8][8]);
die sPiece-Struktur:
typedef struct Piece
{
ePieceType PieceType; //enum
ePlayer Player; //enum
int IsFirstMove;
} sPiece;
Ich habe PInvoke in C#:
[DllImport("chess_api.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern void InitBoard([MarshalAs(UnmanagedType.LPArray, SizeConst = 64)]ref sPiece[] board);
die sPiece-Struktur auf C#:
[StructLayout(LayoutKind.Sequential)]
public struct sPiece
{
public ePieceType PieceType;
public ePlayer Player;
public int IsFirstMove;
}
Wenn ich PInvoke ausführe, erhalte ich die folgende Fehlermeldung:
Ein Anruf Die PInvoke-Funktion „Chess!Chess.Main::InitBoard“ hat den Stapel aus dem Gleichgewicht gebracht. Dies liegt wahrscheinlich daran, dass die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur übereinstimmt. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Ich versuche, die Aufrufkonvention in Cdecl< zu ändern /code>, aber wenn ich es ausführe, bleibt der VS hängen.
Was soll ich tun?