.Net имеет только один метод для извлечения связанных значков, и вы уже упоминали об этом. Каждая библиотека, которую вы можете найти, использует пинвоки, потому что они получают иконки из окон. Поэтому, если вам нужен полностью переносимый механизм извлечения значков, вы, к сожалению, должны написать его самостоятельно, но это единственный способ (и скрыть весь системный код внутри).