WinForms、汎用ライブラリ、Web アプリを含む VS 2008 ソリューションを VS 2010 にアップグレードしましたが、すべてのプロジェクトは依然として .NET 3.5 SP 1 をターゲットにしています。この手法を使用して、汎用ライブラリの XmlSerializers を生成しています。WinForms アプリは問題なく動作します。同じ XmlSerializers を参照するこれらのライブラリを使用して Web アプリを実行しようとすると、次のメッセージがスローされます。
「/WebSubscribers」アプリケーションでサーバー エラーが発生しました。ファイルまたはアセンブリ 'Ceoimage.Basecamp.XmlSerializers' またはその依存関係の 1 つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.BadImageFormatException: ファイルまたはアセンブリ 'Ceoimage.Basecamp.XmlSerializers' またはその依存関係の 1 つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。
.NET Reflectorを使用して XmlSerializer の参照を調べたところ、の 2.0 と 4.0 の両方のバージョンとmscorlib
の 3.5 と 4.0 のバージョンを参照していることがわかりますSystem.Data.Linq
。奇妙なことに、それは の 4.0 バージョンしか使用していませんSystem.Xml
。それはおそらく私の問題です。
これらの XmlSerializers を使用して Web アプリを実行するにはどうすればよいですか? これらの XmlSerializers を削除するだけで、Web アプリは正常に動作します。これはオプションですが、特定のバージョンの CLR 用のシリアライザーを作成するように MSBUILD に強制するにはどうすればよいですか?
XmlSerializers の作成を強制するプロジェクト ファイルに追加する MSBuild タスクを次に示します。
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
<Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
<SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
</Target>