gpt4 book ai didi

c# - 如何从 C# 中的 C++ dll 中使用全局变量的函数获取返回数组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:19 28 4
gpt4 key购买 nike

我有一个用C++写的dll文件(文件名是“DllForTest.dll”),这是它的代码:

#include "stdafx.h"
#include <vector>
using namespace std;

double *ret;
double* _stdcall f(int* n)
{
vector<double> vret;
int i=0;
do
{
vret.push_back(i);
i++;
} while (the condition to stop this loop);
*n=i;
ret = new double[*n];
for (i=0;i<*n;i++)
ret[i]=vret[i];
return ret;
}

这是从上面的 dll 文件调用 f 函数以获取返回值的 C# 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowForm
{
public partial class Form1 : Form
{
[DllImport("DllForTest.dll")]
public static extern double[] f(ref int n);

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
int n=0;
double[] x;
x = f(ref n);
MessageBox.Show("x[0]= " + x[0]);
}
}
}

当我运行时,它会产生一个错误:

无法编码“返回值”:无效的托管/非托管类型组合。

如何修复它以获得想要的结果?谢谢。

最佳答案

尝试将返回值指定为 IntPtr 而不是 double[] 然后使用 Marshal.Copy 将数据从这个 IntPtr 复制到你的 double []数组:

[DllImport("DllForTest.dll")]
static extern IntPtr f(ref int n);

private void button1_Click(object sender, EventArgs e)
{
int n=0;

IntPtr intPtr = f(ref n);
double[] x = new double[n];
Marshal.Copy(intPtr, x, 0, n);

MessageBox.Show("x[0]= " + x[0]);
}

关于c# - 如何从 C# 中的 C++ dll 中使用全局变量的函数获取返回数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25322865/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com