Помимо уровня маршалинга, который отвечает за преобразование параметров для вас и определение соглашений о вызовах, среда выполнения должна сделать несколько других вещей для поддержания согласованности внутреннего состояния.
Необходимо проверить контекст безопасности, чтобы убедиться, что вызывающему коду разрешен доступ к нативным методам.Текущий кадр управляемого стека необходимо сохранить, чтобы среда выполнения могла выполнять обход стека для таких вещей, как отладка и обработка исключений (не говоря уже о собственном коде, который вызывает управляемый обратный вызов).Внутренние биты состояния должны быть установлены, чтобы указать, что мы в настоящее время выполняем собственный код.
Кроме того, регистры, возможно, должны быть сохранены, в зависимости от того, что необходимо отслеживать и которые гарантированно будут восстановленыСоглашение о вызовах.Корни GC, которые находятся в регистрах (локальных), возможно, нужно каким-то образом пометить, чтобы они не собирали мусор во время нативного метода.
Так что в основном это обработка стека и маршалинг типов, с некоторыми мерами безопасностидобавлено. Хотя это не огромное количество вещей, оно будет представлять значительный барьер против вызова меньших собственных методов.Например, попытка P / Invoke в оптимизированную математическую библиотеку редко приводит к выигрышу в производительности, поскольку накладных расходов достаточно, чтобы свести на нет любое из потенциальных преимуществ.Некоторые результаты профилирования производительности обсуждаются здесь .