我刚刚将包含 WinForms、通用库和 Web 应用程序的 VS 2008 解决方案升级到 VS 2010,但所有项目仍以 .NET 3.5 SP 1 为目标。我使用这种技术为我的通用库生成 XmlSerializer。WinForms 应用程序运行良好。当我的 Web 应用程序尝试使用这些引用相同 XmlSerializer 的库运行时,它会抛出以下内容:
“/WebSubscribers”应用程序中的服务器错误。无法加载文件或程序集“Ceoimage.Basecamp.XmlSerializers”或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.BadImageFormatException:无法加载文件或程序集“Ceoimage.Basecamp.XmlSerializers”或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。
我使用.NET Reflector查看了 XmlSerializer 的引用,发现它引用了 .NET Reflector 的 2.0 和 4.0 版本mscorlib
以及System.Data.Linq
. 奇怪的是,它只使用了 4.0 版本的System.Xml
. 那可能是我的问题。
如何使用这些 XmlSerializer 让 Web 应用程序运行?当我简单地删除那些 XmlSerializer 时,Web 应用程序运行良好。这是一个选项,但如何强制 MSBUILD 为特定版本的 CLR 创建序列化程序?
这是我添加到项目文件中的 MSBuild 任务,它强制创建 XmlSerializer:
<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>