在一个二进制文件中定位多个.NET框架?
的背景:
我有一个应用程序需要在已安装的.NET框架范围从2.0到4.5的客户端上运行。 此应用程序必须能够枚举和执行大量文件的操作(在特定情况下超过200k个离散文件)。
要构建文件的索引,应用程序当前使用System.IO.DirectoryInfo.GetFiles()。 这是性能问题,因为处理组件在开始工作之前必须等待整个Path树进行索引。 由于一些古老的磁带多路加载器和一些写得不好的固件,遍历一些目录可能会触发从磁带读取 - 将处理时间从几十秒钟提升到几十分钟。
.NET 4.0提供了System.IO.Directory.EnumerateFiles(Path)方法,可以缓解这个问题。 但是,只有少数数据控制台升级到4.0+,我们的现代化诉求已经遭到敌意。
问题:
是否可以在一个二进制文件中实现GetFiles和EnumerateFiles的方法? 实际上,这将是针对.NET 2.0的单个二进制文件,如果在运行时确定4.0框架可用,则可以调用.NET 4.0方法。
在提及之前:更改数据不是我们客户的选择。 我试过了。 我有没有试过。
您将无法(轻松)制作一个适用于.NET 2.0并使用.NET 4.0方法的单个二进制文件。 有各种各样的迂回方式 - 反射等,但在你的情况下,这似乎是一个坏主意。
但是,没有理由不能为.NET 2.0库中的EnumerateFiles创建自己的实现。 为此,您需要对WIN32函数FindFirstFile
和FindNextFile
进行P / Invoke调用。 两个CodeProject项目看起来像它们覆盖了这个区域,并且应该在源代码中包含正确的位: