2009-10-11 27 views
6

Trong một quá trình sáng tạo thiết lập, tôi đang lên kế hoạch để làm như sau (trong vòng một C# Script):lập trình thay đổi AssemblyVersion và AssemblyFileVersion thuộc tính

  1. Đọc giá trị AssemblyVersionAssemblyFileVersion thuộc tính của một DLL.
  2. Lặp lại tất cả các tệp DLL và thực thi trong dự án và áp dụng các phiên bản đó cho các giá trị thuộc tính AssemblyVersionAssemblyFileVersion của chúng.

Câu hỏi bây giờ là: Làm cách nào để thực hiện bước 2?

Tôi thành công có thể thực hiện bước 1, nhưng đối với bước 2, tôi không thấy điểm bắt đầu thực sự. Những gì tôi có thể phải làm là sử dụng một số phương pháp P/Invoke bản địa vì các thuộc tính trực tiếp sửa đổi thông tin tài nguyên thông tin phiên bản của một DLL/thực thi.

Bất kỳ gợi ý nào về điều này?

Cảm ơn, Uwe

Trả lời

13

Tại sao bạn không, trong quá trình xây dựng, đọc AssemblyVersionAssemblyFileVersion của một DLL, và lưu nó lại khác csproject của AssemblyInfo.cs, chỉ sau đó biên dịch nó?

Như một vấn đề của thực tế, tôi không biết liệu có thể sửa đổi tệp DLL trực tiếp, mà không cần đến một điều gì đó huyền ảo.

Hoặc cách khác, đảm bảo rằng tất cả các tệp DLL của bạn dùng chung một số AssemblyInfo.cs. Bạn có thể thực hiện việc này bằng cách thêm AssemblyInfo.cs làm "Thêm dưới dạng liên kết" khi bạn thêm một mục mới trong csproject. Bằng cách này khi bạn thực hiện một biên dịch, tất cả các DLL sẽ chia sẻ cùng một AssemblyInfo.cs, và do đó xuất ra cùng một AssemblyVersion.

+1

có, đó sẽ là ** ** nhiều dễ dàng hơn! Đặt số phiên bản ngay tại thời gian xây dựng, ví dụ: sử dụng máy chủ tích hợp liên tục –

+1

Đó là cách đúng đắn, việc thay đổi các tệp được biên dịch sẽ phá vỡ dòng thông tin sạch giữa mã và mã nhị phân. –

+0

Cảm ơn bạn rất nhiều, tôi thích ý tưởng chia sẻ tệp AssemblyInfo.cs! –

1

Nếu bạn có quyền truy cập vào các nguồn khác nhau, lấy advice from Graviton

Nếu bạn không, bạn có thể gặp rắc rối. Có thể bạn có thể tháo rời với ILDASM và tập hợp lại với ILASM. Nhưng điều này sẽ không làm việc cho các hội đồng được đặt tên mạnh.

2

Trong trường hợp của tôi, tôi đã tạo mẫu T4 để thay đổi AssemblyVersion và AssemblyFileVersion. Tôi gọi là Assembly.tt mẫu, và làm cho nó một tập tin liên kết (khi bạn thêm nó chọn Add Link, thay vì Add). Tất cả các assembly của tôi đều có trong tệp Assembly.tt được liên kết.

Sau đó, bạn có thể chạy mẫu T4 từ một vị trí và nó sẽ cập nhật tất cả các AssemblyVersion và AssemblyFileVersions. Bạn không cần phải gọi tệp AssemblyInfo.cs để lấy thông tin được đưa vào dll của bạn.

Mã cho tập tin Assembly.tt là:

<#@ template language="C#" hostspecific="true" #> 
// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
[assembly: AssemblyFileVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
<#+ 
    int RevisionYear = DateTime.UtcNow.Year; 
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year,1,1)).TotalDays; 
    int RevisionTime = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day)).TotalMinutes; 
#> 

Đầu ra của mẫu T4 trên sẽ là:

// 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// 

using System.Reflection; 

[assembly: AssemblyVersion("4.2016.284.1066")] 
[assembly: AssemblyFileVersion("4.2016.284.1066")] 
Các vấn đề liên quan