Tôi vừa nâng cấp giải pháp VS 2008 chứa WinForms, thư viện sử dụng chung và ứng dụng web lên VS 2010, nhưng tất cả dự án vẫn nhắm mục tiêu .NET 3.5 SP 1. Tôi sử dụng this technique để tạo XmlSerializers cho các thư viện sử dụng chung của tôi. Ứng dụng WinForms chạy tốt. Khi ứng dụng web của tôi cố gắng chạy sử dụng các thư viện tham khảo các XmlSerializers cùng, nó ném như sau:VS.NET 2010/MSBUILD có thể tạo XmlSerializers cho .NET 3.5 SP1 không?
Server Error in '/ WebSubscribers' Application. Không thể tải tệp hoặc lắp ráp 'Ceoimage.Basecamp.XmlSerializers' hoặc một trong các phụ thuộc của nó. Bản lắp ráp này được tạo bởi thời gian chạy mới hơn thời gian chạy hiện được tải và không thể được tải . Mô tả: Một ngoại lệ không được giải quyết xảy ra trong khi thực hiện yêu cầu web hiện tại là . Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về số lỗi và địa chỉ có nguồn gốc từ mã.
Chi tiết ngoại lệ: System.BadImageFormatException: Không thể tải tệp hoặc lắp ráp 'Ceoimage.Basecamp.XmlSerializers' hoặc một trong các phụ thuộc của nó. Hội đồng này được xây dựng bởi một thời gian chạy mới hơn thời gian chạy hiện đang được tải và không thể tải được.
Tôi đã xem xét tài liệu tham khảo của XmlSerializer sử dụng NET Reflector và xem nó tham chiếu cả 2.0 và 4.0 phiên bản của mscorlib
cũng như 3.5 và 4.0 phiên bản của System.Data.Linq
. Kỳ lạ thay, nó chỉ sử dụng phiên bản 4.0 System.Xml
. Đó có lẽ là vấn đề của tôi ngay tại đó.
Làm cách nào để ứng dụng web chạy bằng các XmlSerializers này? Khi tôi chỉ đơn giản xóa các XmlSerializers, ứng dụng web chạy tốt. Đây là một tùy chọn, nhưng làm thế nào tôi có thể buộc MSBUILD để tạo serializers cho một phiên bản cụ thể của CLR?
Dưới đây là nhiệm vụ MSBuild tôi thêm vào file đó buộc việc tạo ra các XmlSerializers dự án:
<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>
bạn nên thêm rằng chỉnh sửa như một câu trả lời vì vậy chúng tôi có thể bỏ phiếu nó lên, nó dường như là giải pháp tốt nhất :) – Lucas