【问题标题】:Field not found: System.Text.Reg­u­lar­Ex­pres­sions.Regex.in­ter­nal­MatchTime­out未找到字段:System.Text.RegularExpressions.Regex.internalMatchTimeout
【发布时间】:2018-08-04 17:21:03
【问题描述】:

我们遇到了这里描述的问题:field-not-found-exception-with-net-4-4-5-compiled-regexes

简而言之:我尝试在已更新至 .Net 4.5 的机器上构建 .Net 4.0 程序集。所以我的目标是.Net 4.0。尝试在仅安装了 .Net 4.0 的机器上运行此程序集时,出现以下异常:未找到字段:'System.Text.RegularExpressions.Regex.internalMatchTimeout'。

如果我在更新到 .Net 4.5 的机器上构建相同的程序集,我可以在 .Net 4.0 机器上运行生成的程序集而不会出现任何问题。换句话说:在 .Net 4.5 机器上生成的 .Net 4.0 程序集与在 .Net 4.0 机器上生成的程序集相同。

程序集提供预编译的正则表达式。

我可以通过以下方式解决这个问题:

  1. 在 .Net 4.0 系统上构建 de 汇编。
  2. 将目标机器升级到 .Net 4.5。

然而,这两种解决方案都存在问题:

  1. 我们为各种目标构建程序集,包括 WinRT。我们现在面临的问题是,我们无法使用一台机器来构建所有这些,这使我们的构建/测试过程变得复杂。
  2. 生产的组件被运送给客户。如果我们告诉他们升级到 .Net 4.5 以使用 4.0 程序集,他们将不会都感到高兴。

除了摆脱预编译的正则表达式之外,你们有没有人知道更好的解决方案?

【问题讨论】:

  • 你真的需要regex!您可以改为使用字符串方法也很有效。但这实际上取决于您尝试匹配的输入..给我们一些有关您输入的信息以及您用来匹配的regex
  • 好吧,我猜我们总能避免使用正则表达式。感谢您的提议,但如果我们真的需要,我们知道该怎么做。但是:这是现有代码,到处都是正则表达式。因此,如果不需要重写代码,我们希望避免这种情况。特别是因为这个问题基本上不是我们的错,而是微软无法保持正常运行的结果。

标签: .net regex .net-4.5


【解决方案1】:

您的问题尚不清楚,但我假设您正在调用 Regex.CompileToAssembly,在这种情况下,下面会生成一个程序集,该程序集与生成它的运行时紧密耦合,因此如果您在 .NET 4.5 上运行它那么它将引用新的“internalMatchTimeout”字段。除了总是在 .NET 4.0 运行时(解决方案 1)上生成该程序集之外,您是否考虑过在首次使用时编译它们并缓存它们?

RegEx re = new Regex(pattern, RegExOptions.Compiled);

然后您可以简单地在您的应用中缓存您需要的所有 RegEx。虽然这会在第一次使用时产生一点性能影响,但它会防止你在构建中大量跳过箍。

【讨论】:

  • 我们过去确实考虑过这一点,在此问题出现之前。这可能确实是比在 .Net 4.0 机器上构建更好的解决方案。尚不确定是否会导致性能问题(必须尝试)。
  • 请让我知道这种方法是否适合您。我对这可能对您不起作用的任何原因感兴趣。
  • 在搬到新的构建机器之后,我终于又拿起了这个。上面的代码没有解决了这个问题。似乎编译器在构建时将其优化为已编译的正则表达式。有帮助的是避免使用 Compiled 标志。我还没有看到严重的性能差异,但我必须说我们仍然需要进一步评估。 Microsofts info 完全不清楚。如果你读到了,它实际上表明 JIT 编译器也参与了解释表达式。
【解决方案2】:

显然,这是 .NET 4.5 本身或 Visual Studio 的向后兼容性错误。并且它是rather old,如果我们可以从第一个发布日期判断,并且没有解决到该日期(您是否在 4.5 系统上安装了所有 .NET 和 VS 更新?)。如果现在还没有修补,那么我会选择解决方案 1(不能指望 MS 会快速修复错误)。

【讨论】:

  • 我担心有人会这么说。很遗憾,但仍然是一个解决方案,所以我会这样标记它。顺便说一句:是的,4.5 系统具有所有最新更新。它是我的开发机器,而我们的官方构建机器仍在 4.0 上。我们只是碰巧之前没有在 4.5 机器上构建过这个特定的组件。这就是我们现在遇到这个(相当烦人的)问题的原因。如果有人提出更好的解决方案,请不要退缩......
【解决方案3】:

问题陈述: 在 IIS 中浏览任何 .svc 文件时,我遇到了类似

的错误

"未找到字段: 'System.Text.RegularExpressions.Regex.internalMatchTimeout'"

解决方案: 我已经修复了现有的.NET 框架(在我的例子中是 4.5.2)并重新启动了服务器,它开始工作了。

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多