2009-04-03 3 views
7

Tôi có một tập tin GlobalAssemblyInfo.cs trong thư mục gốc của giải pháp của tôi, và tôi có một cái gì đó giống như các mục sau đây trong nó để cho phép mạnh mẽ đặt tên của hội đồng đầu ra của tôi.GlobalAssemblyInfo.cs và đặt tên mạnh

#pragma warning disable 1699 
[assembly : AssemblyKeyFile("..\\keyfile.snk")] 
#pragma warning restore 1699 

Phương pháp này có hai hạn chế. Thứ nhất, AssemblyKeyFileAttribute không được chấp nhận, và vì vậy để tránh cảnh báo biên dịch, tôi cần các dòng pragma bạn thấy ở trên. Thứ hai, tôi cần phải giữ tất cả các dự án của tôi ở cùng độ sâu tương đối với root để sử dụng đường dẫn tương đối, hoặc sử dụng đường dẫn tuyệt đối, dẫn đến vị trí thanh toán trên các máy của người dùng khác (và trên các máy chủ tích hợp/xây dựng liên tục) .

Có ai có giải pháp tốt hơn điều này hay không, ngoài việc thực hiện từng dự án đặt tên mạnh trong tệp dự án?

Trả lời

1

Các thuộc tính này cho việc ký tên khóa không được chấp nhận vì lý do chính đáng (rò rỉ thông tin), đó là một lý do khác để đi tuyến đường dự án.

Nếu bạn có nhiều dự án, bạn có thể đặt chúng qua macro đã ghi hoặc thậm chí thao tác trực tiếp tệp .csproj (đảm bảo chúng được tải xuống từ VS trước).

2

Vâng, để tránh vấn đề đường dẫn, bạn có thể sử dụng [assembly:AssemblyKeyName(...)] thay vào đó (mặc dù IIRC cũng không còn được dùng nữa); sử dụng sn -i để cài đặt khóa được đặt tên. Mỗi máy (mà không xây dựng) sẽ cần thêm phím này.

Khác hơn thế; có, bạn có thể cần chỉnh sửa các tệp dự án.

+0

Đồng ý, điều đó giúp tôi giải quyết vấn đề thứ hai. –

1

Richard làm cho một điểm tốt về rò rỉ thông tin - Tôi đã tìm thấy các bài đăng từ nhóm .NET của Microsoft, nơi họ mô tả điều này. Vì vậy, tôi đã đi cho đề nghị của mình và đưa ra những mục tiêu Nant sau:

<target name="strongName" description="Strong names the output DLLs"> 
    <foreach item="File" property="filename"> 
     <in> 
     <items> 
      <include name="**/*.csproj"></include> 
      <exclude name="**/*.Test.csproj"></include> 
     </items> 
     </in> 
     <do> 
     <echo message="${filename}" /> 
     <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:SignAssembly" value="false"> 
      <namespaces> 
      <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" /> 
      </namespaces> 
     </xmlpoke> 
     <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:AssemblyOriginatorKeyFile" value="..\keyfile.snk"> 
      <namespaces> 
      <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" /> 
      </namespaces> 
     </xmlpoke> 
     </do> 
    </foreach> 
    </target> 

Các <namespace> yếu tố cần thiết cho sự XPath để được giải quyết trong file csproj - lưu ý rằng đây là dành cho VS2008, và một cái gì đó hơi khác nhau có thể cần thiết trong VS2005.