C# to C++ Array?

2019-07-07 05:05发布

I have a library provided, which i know uses C++. I imported the DLL as such:
[DllImport("pst")] private static extern int pst_get_sensor(ref PSTSensor sensor); The PSTSensor is a struct, in a C++ example it was defined as such:

struct PSTSensor
{
        char    name[80];       /**< Device name */
        int     id;             /**< Device identifier (for other tracking interfaces */
        float   pose[16];       /**< Device pose estimate as row-major matrix */
        double  timestamp;      /**< Time the data was recorded */
};

The problem is, that besides an Int and a Double, it uses a Float, and more importantly an array. An array is something way different between C# and C++. When using this struct to call pst_get_sensor(ref sensor); the entire development environment crashes on me when running the code.

I currently do my struct in C# like this:

struct PSTSensor{
        public char[] name;
        public int id;
        public float[] pose;
        public double timestamp;
    }

My question is, how do i create an array that C++ understands, and properly returns? Is this even possible?

Thanks a lot in advance, Smiley

标签: c# c++ pinvoke
2条回答
时光不老,我们不散
2楼-- · 2019-07-07 05:34

You can use fixed keyword with allowing unsafe code option in properties

unsafe struct PSTSensor
{
    public fixed char name[80];
    public int id;
    public fixed float pose[16];
    public double timestamp;
}

This will be the declaration and for using passing it to cpp function you can call like this

unsafe 
{
   PSTSensor stSensor = new PSTSensor();
   testfunc(stSensor); //function call cpp
}
查看更多
爷的心禁止访问
3楼-- · 2019-07-07 05:39

Your C# struct needs to define the inline array lengths. And the name field is best declared as a string in the C# code. That makes it much easier for you to work with it.

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct PSTSensor
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string name;
    public int id;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public float[] pose;
    public double timestamp;
}

The struct layout attribute is optional here, because it just re-states default values. But you may choose to keep it in order to be explicit about your intent.

查看更多
登录 后发表回答