Как передать float по ссылке из C ++ обратно в C #?

Это может быть очевидный вопрос, но я гуглю 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 по соображениям производительности.

Любая помощь очень ценится!

2

Решение

Класс Wrapper должен быть

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

Это закрепит объект в памяти, не позволяя сборщику мусора использовать его, но заставит собственный код работать непосредственно с управляемой переменной. Обычно это не важно, но если у вас был другой поток, которому нужно было видеть промежуточные значения, это как.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]