4

ここで説明する問題が発生しています: 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 にアップグレードします。

ただし、両方のソリューションには問題があります。

  1. WinRT を含むさまざまなターゲットのアセンブリをビルドします。現在、単一のマシンを使用してすべてをビルドできないという問題に直面しており、ビルド/テスト プロセスが複雑になっています。
  2. 生産されたアセンブリは、顧客に出荷されます。4.0 アセンブリを使用するために .Net 4.5 にアップグレードするように伝えても、全員が満足するわけではありません。

プリコンパイルされた正規表現を取り除く以外に、より良い解決策を知っている人はいますか?

4

3 に答える 3

1

あなたの質問からは不明ですが、Regex.CompileToAssembly を呼び出していると仮定します。その場合、その下で発生するのは、生成されたランタイムに密接に結合されたアセンブリが生成されるため、.NET 4.5 でそれを実行すると、新しい「internalMatchTimeout」フィールドへの参照があります。常に .NET 4.0 ランタイムでそのアセンブリを生成する (解決策 1) 以外に、最初の使用時にアセンブリをコンパイルしてキャッシュすることを検討しましたか?

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

その後、アプリで必要なすべての正規表現を簡単にキャッシュできます。これにより、最初の使用時にわずかなパフォーマンス ヒットが発生しますが、ビルドで多くのフープを飛び越えることが防止されます。

于 2013-08-01T16:56:23.933 に答える
0

どうやらこれは、.NET 4.5 自体または Visual Studio の下位互換性のバグです。そして、最初の発行日から判断できる場合はかなり古く、その日付まで解決されていません (4.5 システムにすべての .NET および VS の更新プログラムをインストールしましたか?)。今までにパッチが適用されていない場合は、解決策 1 を使用します (MS がバグを迅速に修正することは期待できません)。

于 2013-07-24T10:32:30.507 に答える