2013-11-27 14 views
7

Hôm nay tôi nhận được một Phiên bản được chỉ định cho 'phiên bản sản phẩm' không có định dạng cảnh báo 'major.minor.build.revision' bình thường.Tại sao cảnh báo CS1607 "Phiên bản được chỉ định cho 'phiên bản sản phẩm' không có định dạng 'major.minor.build.revision' bình thường" được tạo?

Nó liên quan đến việc sử dụng AssemblyInformationalVersionAttribute.

thuộc tính lắp ráp của tôi là:

[assembly: AssemblyInformationalVersion("XXX 1.1.0")] 
[assembly: System.Runtime.InteropServices.ComVisible(false)] 

Về cơ bản trình biên dịch phàn nàn về XXX 1.1.0 rằng không giống như x.y.z.r. Từ MSDN:

Phiên bản thông tin cung cấp thông tin phiên bản bổ sung cho một hội đồng, theo định dạng chuỗi. Nó chỉ dành cho mục đích thông tin và không được sử dụng trong thời gian chạy. Mặc dù bạn có thể chỉ định bất kỳ văn bản nào, thông báo cảnh báo xuất hiện khi biên dịch nếu chuỗi không ở định dạng được sử dụng bởi số phiên bản lắp ráp hoặc nếu định dạng đó ở định dạng nhưng chứa ký tự đại diện. Cảnh báo này là vô hại.

Vì vậy, họ cho biết cảnh báo là vô hại có thể xảy ra. Vấn đề là, nó phá vỡ xây dựng của tôi. Tôi thậm chí không thể ngăn chặn cảnh báo CS1607 (tôi đã thử rằng ở cấp độ dự án, không có hiệu lực) như được đề xuất trong lỗi sau http://connect.microsoft.com/VisualStudio/feedback/details/275197/assemblyinformationalversion-should-not-generate-cs1607

Thực tế, mọi thứ đều ổn (không cảnh báo) cho đến khi tôi thêm tài nguyên cục bộ vào dự án của mình. Trước đây tôi đã có một tệp MyResources.resx trong dự án. Tôi đã thêm một tệp địa phương MyResources.fr.resx và tài nguyên này là nguồn của cảnh báo (hoặc ít nhất: nếu tôi xóa tệp này khỏi dự án, nó sẽ biên dịch mà không cần cảnh báo).

Tôi không thấy bất kỳ mối liên hệ giữa CS1607 (liên quan đến x64 vs x86), AssemblyInformationalVersionAttribute và một tập tin tài nguyên cục bộ ...

Làm thế nào tôi có thể sửa chữa dự án của tôi để tôi có thể sử dụng XXX 1.1.0 như AssemblyInformationalVersionAttribute mà không cần bất kỳ (thậm chí vô hại) cảnh báo?

Tôi không phải là OK với việc ngăn chặn cảnh báo CS1607 (có thể hữu ích trong trường hợp tham chiếu sai), nhưng tôi thậm chí không quản lý để ngăn chặn nó.

Lưu ý rằng tôi thấy nó là CS1607 bởi googling, trình biên dịch không bao giờ trả lại mã cảnh báo thực tế.

Cũng lưu ý mục tiêu dự án của tôi .Net 2.0 và chuyển sang .Net 4.0 khắc phục sự cố (nhưng tất nhiên tôi không thể thực hiện việc này).

Mọi lời giải thích đều được hoan nghênh.

PS: CS1607: The version specified for the 'file version' is not in the normal 'major.minor.build.revision' format in .NET là câu hỏi không liên quan (không phải về AssemblyInformationalVersion)


EDIT: Cảm ơn Hans passant. Từ câu trả lời của bạn, tôi hiểu AssemblyInformationalVersion được sử dụng để tạo ra hai giá trị ProductVersion có sẵn trong cấu trúc Win32 VersionInfo.

  • Nếu thuộc tính AssemblyInformationalVersion trống, thì AssemblyVersion được sử dụng thay thế.
  • Nếu AssemblyInformationalVersionx.y.z, cả hai giá trị ProductVersionx.y.z.
  • Nếu AssemblyInformationalVersion là một chuỗi khác, giá trị số của ProductVersion không được đặt (0.0.0) và chỉ giá trị văn bản ProductVersion được đặt.

Những gì tôi không hiểu, là tại sao cảnh báo CS1607 chỉ được tạo bởi trình biên dịch dưới một số trường hợp cụ thể: trong trường hợp của tôi chỉ khi dự án chứa các file resx cục bộ và nhắm Net 2.0.

Tôi đã sử dụng một chuỗi trong AssemblyInformationalVersion trong nhiều năm mà không có bất kỳ cảnh báo nào cho đến ngày hôm qua, khi tôi thêm một resx được bản địa hóa vào dự án.

Tôi OK khi không có số ProductVersion giá trị được đặt (như bạn đã nói, chỉ giá trị văn bản và có thể đọc được là quan trọng với tôi), nhưng có cách nào để ngăn cảnh báo không được nâng lên không?


EDIT 2:

tôi đã tạo ra một mẫu giải pháp rất nhỏ đó chứng tỏ vấn đề: http://sharesend.com/mb371c3l

  • Đầu tiên biên soạn: CS1607 dự kiến ​​huy động bởi trình biên dịch.
  • Sau đó xóa Logon.aspx.fr.resx và xây dựng lại tất cả: không còn cảnh báo trên máy tính của tôi vì lý do không xác định.

Trả lời

6

Trình biên dịch C# không áp dụng chuyển đổi không phù hợp với các thuộc tính này. Cần tạo các tài nguyên không được quản lý cho tệp thi hành. Cần thiết vì Windows không biết gì về tài nguyên hoặc thuộc tính được quản lý. Điều này thường được thực hiện tự động. Giống như [AssemblyInformationalAttribute] được tự động chuyển đổi để tạo số phiên bản Sản phẩm của tài nguyên Phiên bản. Hãy lưu ý việc đặt tên không phù hợp quyết liệt, không phải là một sai lầm.

Phiên bản sản phẩm không được quản lý tuy nhiên khá phiền hà. Một cái gì đó bạn nhìn thấy trở lại trong lớp FileVersionInfo, cái mà cho phép bạn đọc lại tài nguyên phiên bản không được quản lý từ một tệp thi hành. Lưu ý cách thuộc tính ProductVersion của nó trả về một chuỗi . Nhưng thuộc tính ProductMajorPart (và nhỏ, xây dựng và riêng tư) trả lại int.

Bạn có thể thấy ma sát lúc này. Đối với một số lý do không thể hiểu được từ lâu bị mất trong sương mù của thời gian, thông số ban đầu của tài nguyên Phiên bản bao gồm phiên bản Sản phẩm hai lần. Một lần như một số nhị phân, một lần nữa như một chuỗi. Chuỗi có thể được bản địa hóa, lý do có thể xảy ra cho sự trùng lặp này. Bạn cũng có thể xem lại điều này khi bạn xem tài nguyên bằng trình chỉnh sửa tài nguyên không được quản lý. Sử dụng File + Open + File và chọn tập tin thực thi. Nhấp đúp vào tài nguyên Phiên bản.1. Bạn sẽ thấy phiên bản Sản phẩm xuất hiện hai lần trong hộp thoại này. Phần trên cùng chỉ chấp nhận số, phần dưới cùng chấp nhận bất kỳ chuỗi nào.

Để trình biên dịch C# lên nhánh lạch không có mái chèo, nó phải chuyển chuỗi thuộc tính thành số nguyên để có thể tạo số nhị phân. Rõ ràng nó không thể chỉ để cho rằng đi sai mà không có ít nhất tạo ra một cảnh báo. Việc xác nhận trong tài liệu MSDN cho CS1607 rằng điều này là lành tính không phải là chính xác khủng khiếp, bạn thực sự kết thúc với một nguồn tài nguyên mà không có phiên bản sản phẩm nhị phân được thiết lập. Các tỷ lệ cược rằng điều này kết thúc gây rắc rối tuy nhiên không phải là tuyệt vời, các chương trình khác thường không đọc nó trở lại và nó có xu hướng chỉ được xem xét bởi con người. Bảng thuộc tính "Details" trong hộp thoại Properties của Explorer cho tệp sẽ hiển thị nó. Chuỗi, không phải số nhị phân.

Vì vậy, giải pháp thay thế bạn cần phải suy ngẫm là chỉ cần chỉ định số phiên bản hợp lệ vì số thực sự là số phiên bản. Hoặc để tiếp quản thế hệ tài nguyên không được quản lý để bạn có toàn quyền kiểm soát nội dung. Mà bạn làm bằng cách viết một kịch bản tài nguyên và biên dịch với rc.exe. Và nói với trình biên dịch C# về nó với Project + Properties, tab Application, chọn nút radio "Resource file". Do hãy cẩn thận những nỗi đau đáng kể bạn sẽ gây ra cho chính mình, bây giờ bạn cũng có nhiệm vụ để giữ cho các tập lệnh tài nguyên được cập nhật và đồng bộ với các tài nguyên được quản lý. Đặc biệt đau đớn cho hội đồng vệ tinh tôi muốn nói.

+0

Cảm ơn rất nhiều câu trả lời chi tiết. Tôi đã chỉnh sửa câu hỏi gốc để thêm một số thông tin cơ bản về sự hiểu biết của tôi về vấn đề này. Vui lòng xem bản chỉnh sửa. – ken2k

+0

Tôi không nhận được nó, nó phải được rõ ràng bởi bây giờ lý do tại sao bạn * nên * nhận được cảnh báo. Điều không rõ ràng là lý do tại sao bạn * không * nhận được cảnh báo trước đây. Hoặc có thể bạn đã làm và bạn đã làm điều gì đó không thể hiểu được khiến cho việc xây dựng thất bại trong cảnh báo. Điều đó không thực sự quan trọng, làm những gì bạn cần làm để không làm cho việc xây dựng thất bại. Với việc sử dụng số phiên bản thực thay vì "XXX 1.1.0" làm giải pháp hiển nhiên. –

+0

@ HansPassant Vâng, nó hoàn toàn rõ ràng lý do tại sao tôi nên nhận được cảnh báo. Điều không rõ đối với tôi là tại sao cảnh báo đột nhiên xuất hiện _today_, và không phải trong hai năm qua cho cùng một mã (xem câu hỏi của tôi về những thay đổi mà tôi đã thực hiện ngày hôm nay). Rất tiếc, tôi không thể sửa "XXX 1.1.0" thành "1.1.0" vì một số lý do (tôi không thể thay đổi cách ProductVersion văn bản được hiển thị, bởi vì tôi đã gửi rất nhiều phiên bản của mình bằng mẫu này) . Muốn tôi cố gắng đạt được là _hide_ cảnh báo này cho hội đồng này rất cụ thể, vì vậy xây dựng của tôi không thất bại (tôi cấu hình TFS để từ chối xây dựng trong trường hợp cảnh báo). – ken2k

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