这可能是一个显而易见的问题,但我一直在谷歌搜索2个小时,无法弄明白。所以我有一个C ++类看起来像这样:
class MyClass
{
public:
static void Function(float& r) { r = 10; }
};
我有一个interop包装类,如下所示:
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包装它。
非常感谢任何帮助!
答案 0 :(得分: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); }
};
将对象固定在内存中以防止垃圾收集器使用它,但让本机代码直接在托管变量上工作。通常不重要,但如果你有另一个需要查看中间值的线程,那就是这样。