C# to C++ Array?

╄→гoц情女王★ 提交于 2020-01-04 02:54:32

问题


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


回答1:


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.




回答2:


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
}


来源:https://stackoverflow.com/questions/20145911/c-sharp-to-c-array

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!