如何在c ++ dll

时间:2016-06-13 14:51:04

标签: c# c++ arrays dll

我有一个非托管的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#侧的

有什么想法吗?

0 个答案:

没有答案