Они (pAge
и pYear
) являются нативными указателями, и передача их нативной функции безопасна. Переменные стека (локальные объекты с автоматическим сроком хранения) не подлежат перестановке сборщиком мусора, поэтому закрепление не требуется.
Копирование управляемых данных в стек, а затем передача их собственным функциям, во многих случаях решает проблему gc-moving-managed-data -round (конечно, не используйте ее вместе с обратными вызовами, которые ожидают исходную переменную обновляется до того, как ваша оболочка сможет скопировать значение обратно).
Чтобы получить собственный указатель на управляемые данные, вы должны использовать закрепляющий указатель. Это может быть медленнее, чем метод копирования значения в стек, поэтому используйте его для больших значений или когда вам действительно нужно, чтобы функция работала непосредственно с той же переменной (например, переменная используется в обратных вызовах или многопоточности).
Что-то вроде:
pin_ptr<int> p = &mgd_obj.field;
См. Также документация MSDN