Reputation: 697
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
Upvotes: 3
Views: 245
Reputation: 966
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
}
Upvotes: 1
Reputation: 612964
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.
Upvotes: 6