2009-07-14 51 views
92

Tôi có 2 dự án trong giải pháp của tôi:Làm thế nào để khai báo một hội bạn bè?

  1. hội (Thư viện cơ bản)
  2. thử nghiệm hội (NUnit)

tôi đã tuyên bố lắp ráp thử nghiệm như bạn bè lắp ráp trong dự án đầu tiên:

[assembly: InternalsVisibleTo ("Company.Product.Tests")] 

Mọi thứ đều hoạt động tốt cho đến khi tôi nhận ra rằng tôi đã quên thiết lập giải pháp để ký hợp đồng của mình. Vì vậy, tạo ra một tập tin snk và thiết lập các dự án studio trực quan để ký lắp ráp đầu tiên (Thư viện cơ bản). Bây giờ khi tôi biên dịch dự án đầu tiên, tôi nhận được lỗi sau:

Friend assembly reference 'Company.Product.Tests' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations.

tôi đã cố gắng để trích xuất các khóa công khai từ file snk tôi sử dụng tiện ích sn nhưng nó tạo ra một tập tin nhị phân có dây mà tôi không chắc chắn làm thế nào để sử dụng. Làm cách nào để khắc phục sự cố?

Trả lời

168

Bạn cần ký cả hai cụm, vì có hiệu quả cả hai hội đồng tham chiếu lẫn nhau.

Bạn phải đặt khóa công khai trong thuộc tính InternalsVisibleTo. Ví dụ, trong Nghị định thư Buffers tôi sử dụng:

[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+ 
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+ 
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+ 
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+ 
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+ 
"ad5cedbf")] 

Các khóa công khai được lấy bằng cách chạy

sn -Tp path\to\test\assembly.dll 

Ngoài ra, có được nó từ tập tin .snk:

sn -p MyStrongnameKey.snk public.pk 
sn -tp public.pk 
+0

Không nhiều cụm được ký với cùng một khóa kết thúc bằng cùng một khóa công khai? Điều này có cung cấp một "kết thúc" xung quanh vấn đề, có lẽ không? – Bevan

+0

@Bevan: Vâng, khá Chỉ cần biên dịch một tập tin giả với khóa có lẽ là một cách nhanh hơn để đi - sẽ chỉnh sửa –

+0

Nếu cả hai hội đồng đang được ký kết với các khóa khác nhau, tôi giả sử tôi cần phải xác định khóa công khai của người bạn lắp ráp (bên trong InternalsVisibleTo thuộc tính). – Hemant

-5

Tôi nghĩ bạn cần đặt tên mạnh mẽ, điều này sẽ giống như "Company.Product.Tests, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 17135d9fcba0119f". Tôi giả sử Company.Product.Tests là tên lắp ráp của bạn và 17135d9fcba0119f là khóa công khai.

Một cách khác để giải quyết vấn đề này sẽ không sử dụng các hội đồng riêng biệt. Tôi thường đặt mã nguồn và mã thử nghiệm trong cùng một assembly. Tôi không biết nếu bạn có bất kỳ mối quan tâm đặc biệt mà bạn phải tách chúng.

+0

Tôi không nghĩ chúng tôi cần chỉ định số phiên bản và văn hóa (xem http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx). Tôi havent thực sự cố gắng đưa mã thử nghiệm trong bản thân hội đồng. Sẽ cố gắng và xem nó hoạt động như thế nào (+1 cho tip). – Hemant

+4

Đối với InternalsVisibleTo, PublicKeToken là không đủ. Bạn cần toàn bộ khóa công khai :-( –

-4

Bạn có thể directrly lấy publicKey từ hội đồng mà bạn quan tâm, mà không cần ma thuật với sn.exe

<!-- language: c# --> 
var assemblyName = Assembly.GetExecutingAssembly().GetName(); 
Console.WriteLine("{0}, PublicKey={1}", 
    assemblyName.Name, 
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m)))); 
+1

Đây không phải là câu trả lời cho câu hỏi _this_ này. Nó phải là một bình luận về [câu trả lời nó đang giải quyết] (http://stackoverflow.com/a/1123831/1350209) –

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