Это может быть очевидный вопрос, но я гуглю 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 по соображениям производительности.
Любая помощь очень ценится!
Класс 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); }
};
Это закрепит объект в памяти, не позволяя сборщику мусора использовать его, но заставит собственный код работать непосредственно с управляемой переменной. Обычно это не важно, но если у вас был другой поток, которому нужно было видеть промежуточные значения, это как.
Других решений пока нет …