Например, мы используем XSLT-трансформацию, как шаблонизатор в веб-приложении ASP.NET.
Первое что приходит в голову — это пространство имен System.Xml и System.Xml.Xsl, которые предоставляют универсальные классы для работы с XML и XSLT.
А теперь второе. Что не сразу приходит в голову.
Это подключение ActiveX-компонента MSXML (6.0). Который тоже предоставляет универсальные классы для работы с XML и XSLT. Собственно, сам файл библиотеки компонента (msxml6.dll) копируется в каталог с веб-приложением, а затем на него создается ссылка и уже с компонентом можно спокойно работать из веб-приложения.
В чем нелогичность второго способа? В том, что подключение ActiveX-компонента и работа с ним, значительно снижает производительность? В самом деле, ведь это неуправляемый код, обертка функций, преобразование неуправляемых типов в управляемые типы .NET (маршалинг) и т.п.
На самом деле, всё совершенно наоборот.
Второй способ оказывается производительнее первого. То есть, подключение неуправляемого кода из библиотеки MSXML для XSLT-трансформации намного производительнее, чем использование управляемого кода из пространства имен System.Xml библиотеки .NET.
Время XSLT-трансформации в веб-приложении ASP.NET:
System.Xml (.NET) — Time taken: 0,0228 sec (44) req/sec
MSXML (MSXML 6.0) — Time taken: 0,0025 sec (396) req/sec