2010-11-14 24 views
6

Tình hình là như sau:Phát hành nguồn thư viện lớp học mà không cần ký vào tệp khóa, nhưng các bài kiểm tra đơn vị yêu cầu quyền truy cập vào các lớp nội bộ, phải làm gì?

  1. Tôi muốn giải phóng nguồn đầy đủ đến một thư viện lớp
  2. Tôi muốn phát hành mã nhị phân là tốt, có chữ ký của tôi, với một tập tin quan trọng tôi không muốn xuất bản
  3. Tôi sẽ cung cấp các tệp lô và các bước tạo trước, tạo tệp khóa mới cục bộ nếu không có, để bất kỳ ai cũng có thể nhanh chóng bắt đầu sử dụng mã nguồn
  4. Dự án thử nghiệm cần tham chiếu đến lớp nội bộ dự án chính
  5. Để có quyền truy cập vào lớp nội bộ, tôi cần thêm thuộc tính [assembly: InternalsVisibleTo("...")] vào tệp AssemblyInfo.cs chính
  6. Vì tôi đang ký kết đầu ra của dự án, tôi cần chỉ định phần PublicKey của thuộc tính đó
  7. Điều này sẽ được ràng buộc với tệp khóa, mà tôi không muốn xuất bản

Vì vậy, làm cách nào để giải quyết vấn đề này?

Nếu tôi ký vào đầu ra chính của dự án, và không phải là thư viện kiểm tra, và xác định chỉ có tên lắp ráp trong thuộc tính InternalsVisibleTo, tôi có được điều này lỗi thời gian biên dịch:

Error 1 Friend assembly reference 'Mercurial.Net.Tests' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations. C:\Dev\VS.NET\Mercurial.Net\Mercurial.Net\Properties\AssemblyInfo.cs 22 31 Mercurial.Net

Vì vậy, rõ ràng là không ký kiểm tra đầu ra của dự án là không đủ.

Tùy chọn duy nhất của tôi là xóa cài đặt ký dự án và sửa đổi tệp dự án như một phần của tập lệnh xây dựng nhị phân của tôi? I E. truy tìm phần tử <SignAssembly>false</SignAssembly> của tệp dự án và sửa đổi nó trước khi xây dựng?

Trả lời

2

Có tùy chọn để có tệp SNK mà bạn phát hành chỉ để thử nghiệm không?

Sau đó bạn có thể có hai InternalsVisibleTo và chuyển sang cái nào bạn sử dụng với một #if, ví dụ .:

#if FOR_RELEASE 
[InternalsVisibleTo(... your private SNK ...)] 
#else 
[InternalsVisibleTo(... test SNK which you release ...)] 
#endif 

Sau đó bạn có thể thiết lập FOR_RELEASE khi bạn đang tạo xây dựng của bạn mà bạn muốn xuất bản.

+0

Vâng, điều đó nghe giống như một kế hoạch. –

+0

Tôi chỉ sử dụng '#if DEBUG', RELEASE-build hiện yêu cầu khóa riêng của tôi và tôi có thể dễ dàng viết kịch bản phần đó như một phần của tập lệnh sẽ tạo tệp nhị phân của tôi. Tôi chưa có mặt ở đó nên tôi sẽ xử lý phần đó sau. Tuy nhiên, lựa chọn tốt từ tất cả các câu trả lời ở đây, nhưng đây là những gì tôi đã làm, vì vậy chấp nhận điều này. –

+0

Vâng, bạn đã đến. Mừng vì tôi có thể giúp. –

1

Những gì tôi đã làm với các dự án hệ điều hành của mình rất đơn giản: Tôi có một SNK riêng mà tôi chỉ sử dụng khi xây dựng các dự án cho bản phát hành. Các dự án chỉ được ký khi tôi biên soạn bản phát hành và thông thường các dự án không tham chiếu đến SNK. Điều này giúp dễ dàng sử dụng thuộc tính InternalsVisibleTo, vì không có SNK, điều này luôn hoạt động.

1

Dấu #ifdef được lưu ý, sử dụng khóa "eval" mà bạn không quan tâm.