2013-03-04 39 views
5

Chúng tôi gặp lỗi dường như phổ biếnCompile .net vào xây dựng máy chủ với .net 4.5

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

trong một dự án mà cần phải được biên dịch chống lại Net 4.0 nhưng được xây dựng trên một xây dựng máy chủ đang chạy Windows Server 2012 (với .Net 4.5). Dự án là một ứng dụng web được triển khai tới một máy chủ web chạy năm 2003, nơi cài đặt .Net 4.5 không phải là một tùy chọn. Có nó chạy chống lại "cổ điển" Net 4,0

Từ câu hỏi tương tự, chúng tôi đang cố gắng tùy chọn dòng lệnh để MSBuild:

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

Chúng tôi cũng đã cố gắng kết hợp khác nhau của

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

Các tham chiếu hội đồng (bao gồm cả các tập tin .dll) trong thực tế được cài đặt ở nơi đó trên máy chủ xây dựng. Nhưng khi chúng tôi triển khai trang web và truy cập vào trang chủ, chúng tôi nhận được lỗi đó. (Thật thú vị, khi tải lại trang, lỗi biến mất và trang web hoạt động bình thường.) Các tham số MSBuild cần thiết để biên dịch đối với các hội đồng .Net 4.0 là gì?

Cập nhật Tôi bật lố bịch cấp khai thác gỗ trên MSBuild, và tôi thấy rằng dường như nó đang xây dựng đối với các hội đồng tham khảo Net 4.0:

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

và tôi không thấy bất kỳ đề cập đến hội đồng bên ngoài thư mục đó hoặc thư mục làm việc của máy chủ xây dựng. Vì vậy, nó xuất hiện để biên dịch đúng cách, nhưng khi triển khai trên máy chủ web, nó ném ngoại lệ.

Về ngoại lệ sẽ biến mất khi tải lại trang, tôi tự hỏi liệu điều đó có liên quan đến bước biên dịch trước đánh dấu hay không. Chúng tôi đang chạy aspnet_compile trên máy chủ xây dựng. Có lẽ nếu có một ngoại lệ đến từ một hội đồng được tạo ra, máy chủ web sẽ biên dịch lại nó. Và lắp ráp biên dịch lại là tốt, bởi vì nó được tạo ra với sự thật .Net 4.0.

+0

Bạn đang sử dụng ILMerge? –

+0

Chúng tôi không sử dụng ILMerge. –

+0

Đổi tên C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.dll trên máy chủ xây dựng đó và thực hiện xây dựng sạch sẽ. Bạn sẽ tìm thấy dự án sử dụng các assembly tham chiếu sai. –

Trả lời

3

Vâng câu trả lời hóa ra là đường biên xấu hổ. Sau khi chúng tôi xác nhận từ đầu ra MSBuild chi tiết thực tế là xây dựng dự án trang web chống lại các hội đồng tham chiếu phù hợp, chúng tôi nhận thấy rằng có một số gói NuGet nội bộ trong dự án đã được xây dựng dựa trên .Net 4.5. Một trong số họ đã bị tràn đầy các phương pháp mở rộng, đó là nguyên nhân gây ra ngoại lệ. Xây dựng lại chúng chống lại .Net 4.0 cố định vấn đề.

Điều này sẽ trả về một vấn đề thú vị. Nếu gói NuGet của bên thứ ba được biên dịch cho 4.0 nhưng sử dụng 4.5 tài liệu tham khảo, chúng tôi sẽ ở trong tình huống tương tự, nhưng không thể sửa nó. Vì vậy, bài học cho các nhà xuất bản gói là để đảm bảo phiên bản 4.0 của bạn được biên dịch dựa vào các hội đồng tham chiếu.

Các vấn đề liên quan