Таргетирование нескольких .NET-фреймворков в одном бинарном файле? - программирование
Подтвердить что ты не робот

Таргетирование нескольких .NET-фреймворков в одном бинарном файле?

Фон:

У меня есть приложение, которое нужно запускать на клиентах, чьи установленные .NET-платформы варьируются от 2.0 до 4.5. Это приложение должно иметь возможность перечислять и выполнять операции с большим количеством файлов (более 200 тыс. Дискретных файлов в отдельных случаях).

Чтобы создать индекс файлов, приложение в настоящее время использует System.IO.DirectoryInfo.GetFiles(). Это происходит при поражении производительности, так как компоненту обработки приходится дожидаться индексации всего дерева Path до его начала работы. Из-за некоторых архаичных ленточных многопользователей и некоторых плохо написанных прошивок, перемещение некоторых каталогов может приводить к чтению на лентах - время обработки от десятков секунд до десятков минут.

.NET 4.0 предоставляет метод System.IO.Directory.EnumerateFiles(Path), который облегчает эту проблему. Тем не менее, только несколько небольших консолей были обновлены до 4.0+, и наши просьбы о модернизации были встречены с враждебностью.

Вопрос:

Можно ли реализовать методы как для GetFiles, так и для EnumerateFiles в одном бинарном файле? Фактически, это будет единственный бинарный адрес, предназначенный для .NET 2.0, с возможностью вызова метода .NET 4.0, если во время выполнения было определено, что платформа 4.0 доступна.

Перед тем, как это было сказано: смена даттеров не является вариантом для нашего клиента. Я пробовал. Я когда-нибудь пробовал.

4b9b3361

Ответ 1

Вы не сможете (легко) создать единый бинарный файл, который работает на .NET 2.0 и использует методы .NET 4.0. Есть все виды окольных путей - отражение и т.д., Но в вашем случае они кажутся плохими.

Однако нет причин, по которым вы не можете сделать свою собственную реализацию для EnumerateFiles в библиотеке .NET 2.0. Для этого вы должны сделать вызовы P/Invoke для функций WIN32 FindFirstFile и FindNextFile. Два проекта CodeProject выглядят так, как будто они охватывают эту область, и должны иметь правильные биты в источнике: