9

Kịch bản là: Tôi đang xây dựng giải pháp của mình với TeamCity, tôi không chạy tài khoản xây dựng với tư cách quản trị viên; vì vậy tôi gặp vấn đề với các phím tên mạnh.Chỉ ký các hội đồng có tên mạnh trong khi phát hành

Tôi biết một vài giải pháp ngoài đó, như chạy công cụ xây dựng với tư cách quản trị viên và đăng ký chứng chỉ trong vùng chứa thích hợp.

Có cách nào để ký hợp đồng trong một tệp giải pháp chỉ trong khi xây dựng bản phát hành và không trong quá trình xây dựng gỡ lỗi. Hoặc có bất kỳ giải pháp tương tự?

Tôi nghĩ rằng đó là lạ rằng không có một tham số MSBuild có thể được thiết lập thời tiết các hội đồng nên được ký kết hay không. Bởi vì nếu bạn nhìn vào csproj-file có là một lựa chọn có cho ký hay không ký

+3

Có thông số Msbuild: msbuild (Giải pháp/Dự án)/p: SignAssembly = true /p:AssemblyOriginatorKeyFile=yourKey.snk – SvenG

Trả lời

3

Bạn có thể sử dụng chỉ thị tiền xử lý:

#if SIGN 
//Only the Release build is signed 
#pragma warning disable 1699 //We can't use the compiler switch 
[assembly: AssemblyKeyName("KeyContainerName")] 
#pragma warning restore 1699 
#endif 

Sau đó, xác định biểu tượng SIGN trong cấu hình phát hành.

Bạn phải cài đặt khóa vào vùng chứa khóa bằng cách sử dụng sn.exe. Ngoài ra, bạn có thể sử dụng [AssemblykeyFile] để chỉ định đường dẫn.

#pragma ngăn chặn this warning.

+0

Tôi sẽ đưa chỉ thị tiền xử lý ở đâu? Tôi nghĩ rằng nó lạ mà không có một tham số MSBuild có thể thiết lập wheter hội đồng shuld được ký kết hay không. Bởi vì nếu bạn nhìn vào các tập tin csproj có một tùy chọn có ký hoặc không được ký kết. – Felix

+1

Mọi nơi; thường trong AssemblyInfo.cs. Điều này cũng có thể thực hiện được với MSBuild; Tôi không chắc. – SLaks

10

Một tùy chọn khác là chỉnh sửa tệp dự án. Theo mặc định, nếu bạn cho phép ký hợp đồng trong Visual Studio, nó sẽ được sử dụng cho tất cả các cấu hình xây dựng. Tệp dự án chứa một phần tử như sau.

<PropertyGroup> 
    <SignAssembly>true</SignAssembly> 
</PropertyGroup> 
<PropertyGroup> 
    <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile> 
</PropertyGroup> 

Nếu bạn chỉ muốn ký các hội đồng trong cấu hình xây dựng specifc, chẳng hạn như RELEASE. Bạn có thể đặt <SignAssembly><AssemblyOriginatorKeyFile> trong phần tử Thuộc tính nhóm với Điều kiện xác định cấu hình bản dựng của bạn.

Vì vậy, nếu bạn muốn ký tên trong quá trình xây dựng bản phát hành, bạn có thể thay đổi tệp dự án của mình thành những điều sau đây.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <!-- other element of this PropertyGroup --> 
    <SignAssembly>true</SignAssembly>  
    <AssemblyOriginatorKeyFile>YourKeyFile.pfx</AssemblyOriginatorKeyFile> 
</PropertyGroup> 

Lưu ý: Khi bạn thay đổi tập tin dự án của bạn, như sau. bạn không thể thay đổi các thiết đặt ký của thuộc tính dự án trong Visual Studio. Điều đó có nghĩa trong Visual Studio là việc ký hợp đồng bị vô hiệu hóa, cũng nếu bạn thay đổi cấu hình xây dựng trong Visual Studio.

2

Đây là giải pháp trong đó assembly được ký trong cấu hình Release, nhưng không có trong cấu hình Debug. Nó sử dụng các cơ sở ký kết từ dự án, không sử dụng thuộc tính [AssemblyKeyFile]. Về cơ bản nó giống như Jehof's answer nhưng nói cách khác.

  1. Thiết lập dự án để đăng nhập vào tab trong tùy chọn dự án.
  2. Gỡ bỏ dự án và chỉnh sửa dự án trong trình chỉnh sửa XML. Tìm thuộc tính SignAssembly. Di chuyển thuộc tính đó vào hai nhóm thuộc tính phụ thuộc cấu hình. Trong cấu hình Gỡ lỗi, đặt thuộc tính thành false.

này sẽ giống như thế này:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> 
    <!-- ... --> 
    <SignAssembly>false</SignAssembly> 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> 
    <SignAssembly>true</SignAssembly> 
</PropertyGroup> 

Visual Studio hoạt động chính xác ngay cả khi thay đổi xây dựng cấu hình, với ngoại lệ của Ký tên vào lắp ráp hộp kiểm trong tab. Tôi đã thử nghiệm với Visual Studio 2008.

Cave-Eats:

  • Bạn cần phải loại bỏ các thuộc tính [AssemblyKeyFile] để làm việc này.
  • Nếu bạn có [InternalsVisibleTo] thuộc tính, bạn cần phải duy trì hai phiên bản, như thế này:
#if DEBUG 
[assembly: InternalsVisibleTo("MyLib.NUnit")] 
#else 
[assembly: InternalsVisibleTo("MyLib.NUnit, PublicKey=<your public key>")] 
#endif 

Nói cách khác, MyLib.NUnit cũng phải đăng nhập Release cấu hình.

+0

Visual Studio 2008 dường như không hỗ trợ việc tạo thuộc tính 'SignAssembly' có điều kiện theo cách này. Tôi có rất nhiều 'FileLoadException' tại ứng dụng khởi động kể từ khi Visual Studio 2008 ký một trong các thư viện khi nó không nên, và ngược lại. Sau đó tôi cần phải xây dựng lại ứng dụng. Không chắc chắn liệu các phiên bản sau của Visual Studio có phơi bày hành vi này hay không. – tm1

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