5

一見一般的なエラーが発生しています

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

.Net 4.0 に対してコンパイルする必要があるが、Windows Server 2012 (.Net 4.5 を使用) を実行しているビルド サーバー上にビルドされているプロジェクト。このプロジェクトは、.Net 4.5 をインストールするオプションがない 2003 を実行している Web サーバーにデプロイされる Web アプリケーションです。そこでは、「クラシック」.Net 4.0に対して実行されます

同様の質問から、MSBuild のコマンド ライン オプションを試しています。

/property:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"

の組み合わせも色々試してみました

/property:ReferencePath="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/property:NoStdLib=true
/property:NoCompilerStandardLib=true

参照アセンブリ (.dll ファイルを含む) は、実際にはビルド サーバー上のその場所にインストールされます。しかし、Web サイトをデプロイしてホームページにアクセスすると、そのエラーが発生します。(興味深いことに、ページをリロードすると、エラーは消え、サイトは正常に動作します。) .Net 4.0 アセンブリに対してコンパイルするために必要な MSBuild パラメーターは何ですか?

更新 MSBuild でばかげたレベルのログ記録を有効にしましたが、どうやら .Net 4.0 参照アセンブリに対してビルドしているようです。

Resolved file path is "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll

また、そのフォルダーまたはビルド サーバーの作業ディレクトリの外にあるアセンブリについての言及は見られませんでした。したがって、適切にコンパイルされているように見えますが、Web サーバーにデプロイすると例外がスローされます。

ページのリロード時に例外が消えることに関しては、それがマークアップのプリコンパイル手順に関連しているのかどうか疑問に思います。ビルド サーバーで aspnet_compile を実行しています。おそらく、生成されたアセンブリから例外が発生した場合、Web サーバーはそれを再コンパイルします。再コンパイルされたアセンブリは、真の .Net 4.0 で作成されているため問題ありません。

4

1 に答える 1

3

ええと、答えは恥ずかしい境界線であることが判明しました。詳細な MSBuild 出力から、実際には適切な参照アセンブリに対して Web サイト プロジェクトをビルドしていることを確認した後、.Net 4.5 に対してビルドされた社内の NuGet パッケージがプロジェクトにいくつかあることに気付きました。それらの 1 つは、例外の原因となる拡張メソッドがぎっしり詰まっていました。.Net 4.0 に対してそれらを再構築すると、問題が修正されました。

これは興味深い問題を引き起こします。サードパーティの NuGet パッケージが 4.0 用にコンパイルされていて、4.5 の参照を使用している場合、同じ状況になりますが、修正することはできません。したがって、パッケージ発行者の教訓は、4.0 バージョンが参照アセンブリに対してコンパイルされていることを確認することです。

于 2013-03-05T16:27:24.840 に答える