【问题标题】:Targeting multiple .NET frameworks in a single binary?在单个二进制文件中定位多个 .NET 框架?
【发布时间】:2013-01-29 21:04:38
【问题描述】:

背景:

我有一个应用程序需要在其安装的 .NET 框架范围从 2.0 到 4.5 的客户端上运行。此应用程序必须能够对大量文件(在特定情况下超过 200k 个离散文件)进行枚举和操作。

为了建立文件索引,应用程序当前使用System.IO.DirectoryInfo.GetFiles()。这会影响性能,因为处理组件必须等待整个路径树被索引才能开始工作。由于一些过时的磁带多加载器和一些编写不佳的固件,遍历某些目录可能会触发从磁带读取 - 将处理时间从几十秒缩短到几十分钟。

.NET 4.0 提供了System.IO.Directory.EnumerateFiles(Path) 方法,可以缓解这个问题。然而,只有少数 Datter 游戏机升级到 4.0+,我们要求进行现代化改造的请求遭到了敌意。

问题:

是否可以在单个二进制文件中同时实现 GetFiles 和 EnumerateFiles 的方法?实际上,这将是针对 .NET 2.0 的单个二进制文件,如果在运行时确定 4.0 框架可用,则能够调用 .NET 4.0 方法。

在提到之前:更换 datters 不是我们客户的选择。我试过了。我有没有试过。

【问题讨论】:

  • 如果他们拒绝升级,那么您真的无法解决这个问题。要回答您的问题,这是不可能的。
  • 我认为你可以在 .Net 2 中编写自己的 EnumerateFiles() 实现。
  • 可能能够做的是将不同的代码放在不同的子程序集中,然后在确定安装的 .NET 运行时版本后决定调用哪个。尽管这可能要求主程序是针对最新版本构建的——因此您处于完全相同的位置。
  • 如果这对您来说可能,这个问题可能会有所帮助。 stackoverflow.com/questions/2382927/… 据我所知,不可能同时定位两个框架或有条件地定位。
  • 您可以在安装时通过安装程序中的一些自定义操作进行区分

标签: c# .net multitargeting


【解决方案1】:

您将无法(轻松地)制作适用于 .NET 2.0 并使用 .NET 4.0 方法的单个二进制文件。有各种各样的迂回方式 - 反射等,但在你的情况下这些似乎是个坏主意。

但是,您没有理由不能在 .NET 2.0 库中自己实现 EnumerateFiles。为此,您需要对 WIN32 函数 FindFirstFileFindNextFile 进行 P/Invoke 调用。两个 CodeProject 项目看起来涵盖了这个区域,并且应该在源代码中包含正确的位:

【讨论】:

  • +1 - 我同意。我刚刚反编译了Directory.EnumerateFiles(),虽然它跨越多个类,但复制实现并不难(或者只使用核心 Win32 调用)。
  • 反射似乎是比 PInvoke 更好的选择
  • 您无法使用反射轻松地做到这一点。但是,P/Invoke 执行此操作非常简单(如果您曾经使用 Windows API 进行过编程)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多