2016-03-04 2 views
2

У меня есть метод ++/CLI C, ManagedMethod, с одним выходным аргументом, который будет изменен с помощью собственного метода как такового:Метод C++/CLI вызывает собственный метод для изменения int-need pin_ptr?

// file: test.cpp 

#pragma unmanaged 
void NativeMethod(int& n) 
{ 
    n = 123; 
} 
#pragma managed 

void ManagedMethod([System::Runtime::InteropServices::Out] int% n) 
{ 
    pin_ptr<int> pinned = &n; 
    NativeMethod(*pinned); 
} 

void main() 
{ 
    int n = 0; 
    ManagedMethod(n); 
    // n is now modified 
} 

Once ManagedMethod возвращается, значение n было изменено, как я бы ожидать. До сих пор единственным способом, которым я смог его собрать, является использование pin_ptr внутри ManagedMethod, так что это на самом деле правильный/единственный способ сделать это? Или есть более элегантный способ пройти n до NativeMethod?

ответ

2

Да, это правильный способ сделать это. Очень высокая оптимизация внутри CLR, переменная получает атрибут [закрепленный], поэтому CLR знает, что он хранит указатель на объект, который не должен перемещаться. Отличается от GCHandle :: Alloc(), pin_ptr <> может сделать это, не создавая другого дескриптора. В таблице сообщается, что дрожание генерируется при компиляции метода, GC использует эту таблицу, чтобы знать, где искать корни объектов.

Что действительно имеет значение, когда сбор мусора происходит в то же время, что и NativeMethod(). На практике это случается нечасто, вам нужно будет использовать потоки в программе. YMMV.

Существует еще один способ сделать это, не требует закрепления, но требует чуть-чуть больше машинный код:

void ManagedMethod(int% n) 
{ 
    int copy = n; 
    NativeMethod(copy); 
    n = copy; 
} 

Который работает, потому что местные переменные стека для хранения и, таким образом, не будут тронуты уборщик мусора. Не выигрывает ни одной элегантности для стиля, но то, что я обычно использую сам, оценивая побочные эффекты пиннинга, не так просто. Но, действительно, не бойтесь pin_ptr <>.

 Смежные вопросы

  • Нет связанных вопросов^_^