如何将struct中的char*从c#传递给c ++

use*_*336 6 c# c++ visual-studio

感觉就像我的问题类似于.

到目前为止,我有一个在C++中定义的结构,如下所示:

typedef struct struct_type1
{
    uint64  nameLen;
    char *  name;  
} STATUSSTRUCT;
Run Code Online (Sandbox Code Playgroud)

和一个定义为的函数:

extern int _stdcall getStatus(STATUSSTRUCT * status);
Run Code Online (Sandbox Code Playgroud)

并且可能是这样的功能:

int _stdcall getStatus(STATUSSTRUCT * status)
{
    status->nameLen = someLength;
    status->name = someName;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我实际上无法更改C++代码(出于各种原因)或头文件.

我的C#代码如下所示:

public struct STATUSSTRUCT
{
    public UInt64 nameLen;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4128)]
    public byte[] name;
}
STATUSSTRUCT status;

[DllImport("test.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int getStatus(ref STATUSSTRUCT status);

public void refreshStatus() {
    status = new STATUSSTRUCT();
    status.nameLen = 4128;
    status.name = new byte[4128];
    getStatus(ref status);
}
Run Code Online (Sandbox Code Playgroud)

但是,调用refreshStatus会给我System.AccessViolationException.

有人可以帮我弄清楚如何用C#在C++中调用这个函数吗?

Eri*_*ert 3

您的结构需要一个指向数组的指针;你正在编组数组。交易的一侧期望获得地址“芝麻街 123 号”,并且您提供了该地址的公寓楼的精确复制品。那是行不通的。

为了获得正确的编组代码,您需要对 C# 中的内存管理有透彻而深入的了解。我的建议是您获得专家​​的服务。

  • @FrankJ:这是绝对正确的。问题中没有足够的信息来给出可能正确的答案,提出探索性问题以确定信息最好由对内存管理有透彻而深入了解的专家来完成。如果您是这样的专家,那么我鼓励您给出您更喜欢的答案。 (2认同)