отличный ответ на SO о том, как установить каталог поиска DllImport
во время выполнения. Работает отлично с двумя строками кода.
Однако многие проекты с открытым исходным кодом вместо этого используют функцию LoadLibrary. Есть "слухи" о том, что вызов собственных методов через делегатов происходит медленнее. Я называю их "слухами", потому что я видел это только в двух местах, и это все равно микро-оптимизация.
Самое интересное место в этом блоге: http://ybeernet.blogspot.com/2011/03/techniques-of-calling-unmanaged-code.html
Там автор измерил производительность разных методов:
- С# (информативный) 4318 мс
- PInvoke - сдерживаемая защита 5415 мс
- Инструкция Calli 5505 мс
- С++/CLI 6311 мс
- Функция делегирования - сдерживаемая защита 7788 мс
- PInvoke 8249 мс
- Делегат функций 11594ms
NNanomsg использует делегаты функций, но упоминает запись в блоге с комментарием "Влияние производительности на обычный P/Invoke, очевидно, не хорошо" на эта строка.
сервер Kestrel от MSFT ASP vNext использует ту же технику с библиотекой Libuv: вот код
Я думаю, что делегаты более громоздки в использовании, чем простой DllImport, и учитывая разницу в производительности, мне интересно, почему ориентированные на производительность библиотеки используют делегатов вместо установки папки поиска dll?
Существуют ли какие-либо технические причины, такие как безопасность, гибкость или что-то еще, или это просто вопрос вкуса? Я не понимаю обоснования - возможно ли, что авторы просто не искали StackOverflow достаточно??