gpt4 book ai didi

c# - 将 C++ 结构转换为 C# 并使用它?

转载 作者:行者123 更新时间:2023-11-30 05:42:22 29 4
gpt4 key购买 nike

我有一个如下所示的 C++ 结构:

struct Vehicle
{
u32 something;
Info *info;
u8 something2[ 0x14 ];
Vector3f location;
Template* data;
};

struct Info
{
u32 speed;
std::string name;
BuffCollection** buffCollection;
void* sectionPtr;
};

struct Template
{
u32 templateID;
};

From this question , 我想出了 u32、u8 等的含义,或者我想我做到了。

然后我尝试用它制作我自己的 C# 结构:

[StructLayout(LayoutKind.Sequential)]
public struct Vehicle
{
public uint Something;
public Info Info;
public byte Something2;
public Vector3f Location;
public Template Data;
}

[StructLayout(LayoutKind.Sequential)]
public struct Info
{
public uint Speed;
public string Name;
public byte[] BuffCollection;
public IntPtr SectionPointer;
}

[StructLayout(LayoutKind.Sequential)]
public struct Template
{
public uint TemplateId;
}

public struct Vector3f
{
public float X, Y, Z;
public Vector3f(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
}

但是,当我尝试读取 Vehicle 时:

[DllImport("Core.dll")]
static extern Vehicle GetVehicle();

static void Main()
{
var vehicle = GetVehicle();
Console.WriteLine(vehicle.Info.Name);
Console.ReadKey();
}

我收到以下错误:

System.Runtime.InteropServices.MarshalDirectiveException: Method's type signature is not PInvoke compatible

根据我对它所做的搜索,它让我相信我的结构转换是错误的。

  • 我的转换结构有什么问题?

最佳答案

关于结构:

  1. Vehicle.Info是一个指针,所以需要声明为IntPtr Info,然后使用Marshal.PtrToStructure/Marshal.StructureToPtr 在托管代码中读取/写入其值;

  2. Vehicle.something2 是字节数组,不是字节,所以需要这样声明:

    [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)]
    byte[] something2=new byte[20];

  3. Vehicle.Data - 参见 #1,同样的问题

  4. Info.Name - .NET 不为 std::string 提供编码,因此您需要编写自己的编码器(请参阅:Custom Marshaler for PInvoke with std::string)或将类型更改为某些内容就像你的 C++ 库中的 char*。
  5. Info.BuffCollection 也应该是 IntPtr 或 BuffCollection[](取决于 BuffCollection 类型是什么——您的问题中没有提供)

关于GetVehicle();方法的签名和调用:

很可能该方法返回指向结构的指针,而不是结构本身(只是推测,请仔细检查)。如果是这样,您需要将其声明为

static extern IntPtr GetVehicle();

然后使用 Marshal.PtrToStructure 将其转换为您的结构,如下所示:

var vehiclePtr=GetVehicle();
var vehicle = (Vehicle)Marshal.PtrToStructure(vehiclePtr, typeof(Vehicle));

关于c# - 将 C++ 结构转换为 C# 并使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690823/

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