Согласно MSDN - вызов собственных функций из управляемого кода
PInvoke имеет служебную нагрузку от 10 до 30 x86 инструкций на вызов.В дополнение к этой фиксированной стоимости маршалинг создает дополнительные накладные расходы.Нет затрат на маршалинг между blittable типами, которые имеют одинаковое представление в управляемом и неуправляемом коде.Например, перевод между int и Int32 не требует затрат.
По моему опыту, при P / Invoking собственных функциях определенно возникают накладные расходы, но обычно снижение производительности не стоит беспокоить.,Стоит помнить о стоимости маршалинга.Если вы передаете большие структуры, строки и т. Д., Тогда затраты на производительность будут быстро отображаться.
Для P / Вызванных функций, которые вызываются очень часто, вы можете рассмотреть возможность добавления [SuppressUnmanagedCodeSecurity]
к вашему P /Вызвать определения функций (см. MSDN - SuppressUnmanagedCodeSecurityAttribute ).Это мешает среде выполнения выполнять обход стека, чтобы гарантировать, что вызывающая сторона имеет разрешение UnmanagedCode.Конечно, перед добавлением этого атрибута убедитесь, что вы понимаете последствия для безопасности.