gpt4 book ai didi

c# - PInvoke 不改变对象

转载 作者:太空宇宙 更新时间:2023-11-04 08:36:36 26 4
gpt4 key购买 nike

我有以下 PInvoke:(CC#)

[DllImport("chess_api.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void InitBoard([MarshalAs(UnmanagedType.LPArray, SizeConst = 64)]sPiece[] board);

C 上:

__declspec(dllexport) void InitBoard(sPiece board[8][8]);

在 InitBoard 函数中,矩阵的值发生变化,但调用 PInvoke 后我没有看到变化。

sPiece[] board = new sPiece[64];
InitBoard(board);
//Here the values ​​of the board is still initialized (as before the function call) at default values

我试图将变量更改为 ref(尽管它已经引用)但是它在调用函数时卡住了程序,所以我认为这不是解决方案。

我花了一段时间才到这里(我是这个主题的新手)我很乐意提供帮助!

编辑:

C 上的片段:

typedef struct Piece
{
ePieceType PieceType; //enum
ePlayer Player; //enum
int IsFirstMove;
} sPiece;

C# 上的片段:

[StructLayout(LayoutKind.Sequential)]
public struct sPiece
{
public ePieceType PieceType;
public ePlayer Player;
public int IsFirstMove;
}

最佳答案

可能您在调用函数之前未能分配内存。

sPiece[] board = new sPiece[64];
InitBoard(board);

像这样声明函数:

[DllImport("chess_api.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void InitBoard([Out] sPiece[] board);

默认编码是[In]。虽然由于您的结构是 blittable,您传递的数组被固定并且调用的行为就像它是 [In,Out] 一样。所以我认为如果你愿意,你可以省略 [Out] ,但它比上面写的更清楚。

如果您愿意,可以添加 UnmanagedType.LPArray 选项,但这不是必需的。

关于c# - PInvoke 不改变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25955861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com