在一个二进制文件中针对多个.NET框架进行定位?

14

背景:

我的应用程序需要在安装的.NET框架版本从2.0到4.5的客户端上运行。该应用程序必须能够枚举和操作大量文件(在某些情况下超过200k个离散文件)。

为了构建文件索引,该应用程序目前使用System.IO.DirectoryInfo.GetFiles()。这会导致性能损失,因为处理组件必须等待整个路径树被索引完毕才能开始工作。由于一些古老的磁带多载机和一些编写不良的固件,遍历某些目录可能会触发对磁带的读取 - 使处理时间从几十秒增加到几十分钟。

.NET 4.0提供了System.IO.Directory.EnumerateFiles(Path)方法,可以缓解此问题。但是,只有少数数据台式机已升级到4.0+,我们的现代化请求遭到了敌视。

问题:

是否可能在单个二进制文件中实现GetFiles和EnumerateFiles方法? 实际上,这将是一个针对.NET 2.0的单个二进制文件,具有在运行时确定4.0框架是否可用的能力。

在提到这点之前:我们无法更换数据台式机。我试过了,真的。


1
如果他们拒绝升级,那么你无法解决这个问题。回答你的问题,这是不可能的。 - Dennis Rongo
6
我可以想到,在 .Net 2 中,您可以编写自己的 EnumerateFiles() 实现。 - Matthew Watson
可能能够做的是将不同的代码放在不同的子程序集中,然后在确定安装的.NET运行时版本后决定调用哪个。虽然这可能需要主程序针对最新版本进行构建-因此使您处于完全相同的位置。 - ChrisF
如果可能的话,您可以使用反射,但由于.NET 4.0是一个不同的运行时,我认为这可能不起作用。 - jbtule
因此,您可以使用.NET4.0程序集中的System.IO.Directory.EnumerateFiles(Path)实现功能,使其COM可见,然后在.NET2.0应用程序中使用此COM组件。但是,这将需要在每台计算机上安装.NET4.0,并且您描述了这是不可能的。 - Adrian Ciura
显示剩余3条评论
1个回答

10
您无法轻松地创建一个单一二进制文件,该文件可以在.NET 2.0上运行并使用.NET 4.0方法。有各种绕路的方法 - 反射等,但在您的情况下似乎不是一个好主意。
但是,您完全可以在.NET 2.0库中为EnumerateFiles创建自己的实现。为此,您需要对WIN32函数FindFirstFile和FindNextFile进行P / Invoke调用。两个CodeProject项目看起来涵盖了这个领域,并且源代码应该没有问题:

+1 - 我同意。我刚刚反编译了 Directory.EnumerateFiles(),虽然它涉及多个类,但复制实现并不难(或者只需使用核心 Win32 调用)。 - Tim M.
反射似乎比PInvoke更好的选择。 - Sten Petrov
你无法轻松地使用反射来完成这个任务。然而,使用P/Invoke来完成这个任务确实非常容易(如果你以前曾经使用过Windows API编程)。 - Matthew Watson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接