2

这可能是一个明显的问题,但我已经用谷歌搜索了 2 个小时,无法弄清楚。所以我在 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 包装它。

任何帮助是极大的赞赏!

4

1 回答 1

2

包装类需要

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); }
};

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

于 2013-07-14T00:33:59.030 回答