找不到字段:System.Text.RegularExpressions.Regex.internalMatchTimeout

时间:2013-07-24 08:46:12

标签: .net regex .net-4.5

我们遇到了此处描述的问题: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系统上构建程序集。
  2. 将目标计算机升级到.Net 4.5。
  3. 然而,两种解决方案都存在问题:

    1. 我们为各种目标构建程序集,包括WinRT。我们现在面临的问题是,我们不能使用单个机器来构建所有这些,这使我们的构建/测试过程变得复杂。
    2. 生产的组件运送给客户。如果我们告诉他们升级到.Net 4.5,以便使用4.0程序集,他们将不会感到高兴。
    3. 除了摆脱预编译的正则表达式之外,你们中的任何人都知道一个更好的解决方案吗?

3 个答案:

答案 0 :(得分:1)

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

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

然后您只需在应用中缓存所需的所有RegEx即可。虽然这会在第一次使用时给予一点点打击,但它会阻止你的构建中大量的跳跃。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

问题陈述: 在IIS中浏览任何.svc文件时,出现

之类的错误
  

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

解决方案: 我已经修复了现有的.NET框架(以我的情况为4.5.2),并重新启动了服务器,服务器开始工作。