这可能是一个显而易见的问题,但我已经用谷歌搜索了两个小时,但无法弄清楚。所以我有一个 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/