我有一个非托管的C ++ dll,它带有C风格的导出函数,我试图在C#代码中使用它。该函数应该将数组作为参数并修改它们,以便我可以在C#中使用结果。
所以我想出了如何使用float数组做到这一点。当我的C函数看起来如下......
__declspec( dllexport ) float testArrayFlt( const float *f, int arraySize, float *fCopy )
{
float sum = 0.0f;
for( int i = 0; i < arraySize; i++ )
{
sum += f[i];
fCopy[i] = f[i];
}
return sum;
}
...然后我必须在C#中声明如下:
[DllImport( lib )]
public static extern float testArrayFlt( float[] f, int arraySize, float[] fCopy );
现在,当我像这样使用它时,一切运作良好:
float[] flt = new float[10];
float[] fltCopy = new float[flt.Length];
for( int i = 0; i < flt.Length; i++ )
flt[i] = i;
float f = testArrayFlt( flt, flt.Length, fltCopy );
Console.WriteLine( "flt sum: " + f );
for( int i = 0; i < fltCopy.Length; i++ )
Console.WriteLine( "flt #" + i + ": " + fltCopy[i] );
我得到的输出是:
总和:45
flt#0:0
flt#1:1
flt#2:2
flt#3:3
flt#4:4
flt#5:5
flt#6:6
flt#7:7
flt#8:8
flt#9:9
现在,当我尝试使用Vector类型(由三个浮点组成)时,只有一半可以工作。传递和读取数据以及返回结果都有效,但不能修改传递的数组。更详细:我得到了一个C函数如下:
__declspec(dllexport) glm::vec3 testArrayVec3( const glm::vec3 *points, int arraySize, glm::vec3 *pointsCopy )
{
glm::vec3 sum( 0.0f );
for( int i = 0; i < arraySize; i++ )
{
sum += points[i];
pointsCopy[i] = points[i];
}
return sum;
}
其中glm :: vec3基本上只是三个浮点数的结构。在C#中,我定义了一个对应的
struct Vec3f
{
public float X;
public float Y;
public float Z;
public override string ToString()
{
return "[" + this.X + ", " + this.Y + ", " + this.Z + "]";
}
};
...将dll导入声明为...
[DllImport( lib )]
public static extern Vec3f testArrayVec3( Vec3f[] points, int arraySize, Vec3f[] pointsCopy );
...并按如下方式使用:
Vec3f[] points = new Vec3f[10];
Vec3f[] pointsCopy = new Vec3f[points.Length];
for( int i = 0; i < points.Length; i++ )
points[i].X = points[i].Y = points[i].Z = i;
Vec3f p = testArrayVec3( points, points.Length, pointsCopy );
Console.WriteLine( "vec sum: " + p );
for( int i = 0; i < pointsCopy.Length; i++ )
Console.WriteLine( "vec #" + i + ": " + pointsCopy[i] );
现在我得到以下输出:
vec sum:[45,45,45]
vec#0:[0,0,0]
vec#1:[0,0,0]
vec#2:[0,0,0]
vec#3:[0,0,0]
vec#4:[0,0,0]
vec#5:[0,0,0]
vec#6:[0,0,0]
vec#7:[0,0,0]
vec#8:[0,0,0]
vec#9:[0,0,0]
令我困惑的是,它不能 远远不是正确的,因为总和的计算和返回确实有效。看起来第二个数组似乎没有通过引用正确传递,但我无法找到如何做到这一点。此外,在浮动版本中它就像那样工作。我还检查了dll,glm :: vec3赋值 工作,所以pointsCopy实际上 包含循环后的正确数据,但它没有到达C#侧的
有什么想法吗?