c# - 如何通过引用将 float 从 C++ 传递回 C#?

标签 c# c++ c++-cli wrapper ref

这可能是一个显而易见的问题,但我已经用谷歌搜索了两个小时,但无法弄清楚。所以我有一个 C++ 类,如下所示:

class MyClass
{
public:
  static void Function(float& r) { r = 10; }
};

我有一个互操作包装类,如下所示:

public ref class Wrapper
{
public:
    static void WrappedFunction(float& r) { MyClass::Function(r); }
};

现在我想从 C# 调用它,如下所示:

float r;
Wrapper.WrappedFunction(ref r);

但是我在 C# 端收到一个编译错误,其中显示:

 cannot convert from 'ref float' to 'float*'

我有一个模糊的想法,我需要在 Wrapper 类中做一些事情,但我不知道做什么。另外,我知道这个用例对于 dllimport/pinvoke 来说是微不足道的,但出于性能原因我想用 C++/CLI 包装它。

非常感谢任何帮助!

最佳答案

包装类需要是

public ref class Wrapper
{
public:
    static void WrappedFunction(float% r)
    { float copy = r; MyClass::Function(copy); r = copy; }
};

使用 % 定义的引用几乎与使用 & 定义的引用完全相同,只是它们与垃圾收集器一起工作。

另一个选择是

public ref class Wrapper
{
public:
    static void WrappedFunction(float% r)
    { pin_ptr<float> p = &r; MyClass::Function(*p); }
};

这会将对象固定在内存中,防止垃圾收集器使用它,但让 native 代码直接在托管变量上工作。通常并不重要,但如果您有另一个线程需要查看中间值,这就是方法。

关于c# - 如何通过引用将 float 从 C++ 传递回 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635013/

相关文章:

c++ - Haskell 等同于非类型上的 C++ 模板

c++-cli - c++/cli 如何在内部与非托管部分一起工作?

c# - .NET 4.5 命名空间 'Standard'

c# - 结构图 - 覆盖注册

c# - 打印没有预览的 ReportViewer

c++ - 简化双链转换

c++ - 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’ 时出错“

c++ - Visual C++/Cli 中的异步 sleep ,如何创建一个 X 毫秒的时间来调用函数而不会使 GUI 停止

c# - 如何在 C# 中使用 mschart 以百分比格式显示数据点

c# - 使用 RSA-SHA256 签名方法问题对 Xml 文档进行签名