【问题标题】:returning arrays and structs from a c++ function in c#从 c# 中的 c++ 函数返回数组和结构
【发布时间】:2016-12-09 21:32:21
【问题描述】:

我有一个用 c++ 编写的函数,我把它放在一个 dll 中,并使用 DllImport 在 c# 中使用。一切正常;我能够从 c++ 获取返回值并将其显示在我的 c# GUI 中。现在我想添加到该函数并让它返回多个值(到目前为止为 3 个)。我已经尝试过Return C++ array to C# 和How to return two different variable in c++? 中给出的方法,但都不起作用。 第一篇文章中的代码给了我一个访问冲突错误,而第二篇文章的代码给了我结构的所有 0 值。对于第一个,我什至完全复制了给定的代码并尝试运行它,但无济于事。什么可能导致这些方法给出的错误和错误值?我怎样才能让它们工作?

以防万一,我自己的代码与第二篇文章的实现如下。

二等分.h

 struct Result
{
    double root;
    double relError;
    double absError;
}result;
extern "C" {__declspec(dllexport) Result bisection( double l, double u, double stoppingError, int maxIter); }

二等分.cpp

Result bisection(double l, double u, double stoppingError, int maxIter) {
//code for this function
result.root = xr;
result.relError = e;
result.absError = 1;    
return result;
}

c#代码

    [StructLayout(LayoutKind.Sequential)]
    public struct Result
    {
        public double root;
        public double relError;
        public double absError;            
    }
    [DllImport(dllPath)]
    private static extern Result bisection(double l, double u, double stoppingError, int maxIter);

Result result = bisection(data[0], data[1], 0.1, 100);

【问题讨论】:

  • 您的标头有bisection 返回一个double,而实现返回一个Result。
  • 啊!当我编辑我的代码以在此处发布时出现的错误。我已经修好了。
  • 也许将结果作为输出参数而不是返回它会更好,并让 C++ 代码填充 Result。这将遵循您如何调用需要“返回结构”的 Windows API 函数的模型(如 GetMessage)
  • @PaulMcKenzie 抱歉回复晚了,我跑题了。这是一个好主意。我已经实现了它并且运行良好;我不必搞乱数组和编组。我可以直接获得我需要的值。此外,它释放了返回值,我现在可以使用它来确定函数是否正常运行。我期待它不会出现的情况;表示函数成功或失败的整数返回值是救命稻草。谢谢!

标签: c# c++ arrays struct dllimport


【解决方案1】:

您的代码几乎是正确的。调用约定不匹配。 C++ 代码使用 cdecl,即 C# 标准调用。换一个,使它们匹配。

【讨论】:

  • 是的,就是这样;这就是它所做的。我从几个在线资源中复制粘贴了代码,我在编辑以满足我的需要时一定把它搞砸了。我阅读了调用约定和默认的 stdcall;一旦我按照您的指示进行了更改,代码就可以正常工作。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多