c# - 将结构数组从 c 返回到 c#

标签 c# c arrays struct marshalling

我正在制作一个 c# 程序来绘制用 c 计算的三次样条曲线,这是程序的互操作部分

我的 C# 代码:

    [DllImport(@"..\..\..\Debug\Spline_Core.dll")]
    static extern IntPtr mult_points(Point[] points, int points_count, double factor);

    public Form1()
    {
        InitializeComponent();

        var points = new[]
        {
            new Point { x = 2, y = 3 },
            new Point { x = 5, y = 7 },
        };

        var sum = mult_points(points, 2, 2);
        var mult = (Point[])Marshal.PtrToStructure(sum, typeof(Point[]));
    }

和C代码:

typedef struct point
{
    double x, y;
} Point;

extern __declspec(dllexport) Point* __stdcall mult_points(Point* points, int points_count, double factor)
{
    int i;

    Point* mult_points = (Point*)malloc(points_count * sizeof(Point));

    for (i = 0; i < points_count; i++)
        mult_points[i] = create_point(points[i].x * factor, points[i].y * factor);

    return mult_points;
}

我可以通过参数将点数组从 c# 传递到 c,但我无法取回它。

最佳答案

Point* 在技术上只是指向单个 Point 结构的指针。编码器不知道它是否是一个数组或这样的数组中有多少个元素。所以你对 Point[] 的转换是错误的。

为了更好地理解,请看这个简单的例子——而不是这段代码:

var sum = mult_points(points, 2, 2);
var mult = (Point[])Marshal.PtrToStructure(sum, typeof(Point[]));

...你可以使用这样的东西:

IntPtr sum = mult_points(points, 2, 2);
int structSize = Marshal.SizeOf(typeof(Point));
for (int i = 0; i < numberOfPoints; i++)
{
    IntPtr curr = sum + (i * structSize);
    Point pt = (Point)Marshal.PtrToStructure(curr, typeof(Point));
    // Add pt to List<Point> for example
}

这不是一个理想的解决方案,但我希望您明白这一点。 可以在这里找到更好(更优雅)的解决方案:How do I marshall a pointer to a pointer of an array of structures?

关于c# - 将结构数组从 c 返回到 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122856/

相关文章:

c# - 网页中文本之间的空格问题

c# - 有谁知道如何在 ParallelExtensionExtras 中使用 IOCompletionPortTaskScheduler 和 IOTaskScheduler 以及它们的用途是什么?

c - 段错误 - 自定义 Shell

Java 空指针异常和堆栈溢出错误

javascript - 从数组中选择特定数字

c# - 如何在回发时将数据保存在 asp 转发器中

c# - 带输出参数的 Lambda 泛型表达式

c - 当我尝试在某个目录中创建一个 txt 文件时,它的末尾有垃圾字符

c - 我需要更好地解释 100 扇门计划

javascript - 将数组分成两部分