2015-06-19 11 views
6

Tôi đang sử dụng thuộc tính "InternalsVisibleTo" với một assembly để hiển thị các phương thức/lớp bên trong cho dự án thử nghiệm đơn vị của tôi.Làm cách nào để sử dụng thuộc tính "InternalsVisibleTo" với cụm được đặt tên mạnh?

Tôi bây giờ cần phải cài đặt hội đồng đó vào GAC, vì vậy tôi cần phải cung cấp cho nó một tên mạnh mẽ. Khi tôi cố gắng làm điều đó, tôi nhận được lỗi sau trong Visual Studio.

hội Mạnh-tên ký phải xác định một khóa công khai trong tờ khai InternalsVisibleTo họ

Một chút Googling đưa tôi đến bài viết dưới đây:

https://msdn.microsoft.com/en-us/library/bb763089.aspx

Bài viết này nêu rõ:

"Xác định pu chìa khóa blic cho hội đồng người bạn được đặt tên mạnh mẽ. "

Bài viết này không nói cách xác định khóa công khai. Tôi tìm khóa công khai cho hội thảo ở đâu? Ngoài ra, một khi tôi có khóa công khai, đây có phải là cách chính xác để khai báo thuộc tính không?

[assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")] 
+0

Google "khóa công khai lắp ráp mạng" và thực hiện lần truy cập đầu tiên. –

+0

Tôi đã thử điều đó. Nó nói để sử dụng SN.exe, nhưng điều đó chỉ hoạt động khi lắp ráp được ký kết mạnh mẽ. Tôi không thể có được lắp ráp của tôi để biên dịch như đánh mạnh mẽ do lỗi trên. SN.exe cho lỗi ".dll không đại diện cho một hội đồng được đặt tên mạnh" – Dave

+2

Dường như bạn có gà và trứng đảo ngược, bạn cần khóa công khai của assembly * khác *. –

Trả lời

8

Để sử dụng InternalsVisibleTo với cụm mạnh mẽ, cụm "bạn bè" của bạn cũng phải được ký mạnh. Lưu ý rằng thuộc tính không được sử dụng để xác nhận hợp lệ khi lắp ráp tại thời điểm biên dịch - nó chỉ xác định rằng kiểm tra thời gian chạy (và kiểm tra thời gian biên dịch cho lắp ráp của bạn bè) nên xác nhận danh tính đó. Vì vậy, nếu bạn chỉ cần cần biên dịch chính bạn, bạn có thể chỉ định bất kỳ mã thông báo khóa công khai nào (ví dụ: một từ các hội đồng của Microsoft như được tìm thấy trong tất cả các tham chiếu lắp ráp trong ví dụ Web.Config của bạn).

Thông thường vì bạn sẽ ký hợp đồng, bạn sẽ biết khóa công khai. I E. nếu bạn có tệp snk hơn sn -t youSnk.snk sẽ hiển thị khóa công khai. Hoặc bạn có thể làm theo các bước trong Getting Public Key Token of Assembly Within Visual Studio để định cấu hình VS của bạn để hiển thị mã thông báo công khai cho bất kỳ hội đồng nào.

1

Nếu bạn không kiểm tra cấu hình phát hành của bạn, đây là một cách giải quyết đơn giản:

#if DEBUG 
[assembly: InternalsVisibleTo("TestProjNamespace")] 
#endif 
7

Để ai đó đang sử dụng Visual Studio 2017, đó là phương pháp mới nhất:

Từ IDE yêu quý của chúng tôi , đi đến "Tools> Tools ..." và "Thêm" một công cụ mới với những thiết lập:

  • Tiêu đề: Nhận PublicKey
  • lệnh: "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.2 Tools \ sn.exe" (/ \ chọn phiên bản công cụ NETFX phù hợp với phiên bản NETFX lắp ráp của bạn, ở đây là 4.6.2)
  • Arguments: -Tp $ (TargetPath)
  • Kiểm tra "Sử dụng cửa sổ Output" hộp kiểm

Apply/OK những thay đổi đó.

Trong mục "Giải pháp thám hiểm" nhấp chuột vào tên lắp ráp dự án của bạn, và sau đó đi đến "Tools> Nhận PublicKey". Cửa sổ đầu ra sẽ hiển thị Khóa công cộng (khá dài), cùng với Khóa mã thông báo công khai.

Cuối cùng, trong dự án mà tổ chức lớp bên trong (tức là dự án thử nghiệm) mà bạn muốn để lộ, mở "AssemblyInfo.cs" tập tin và thêm dòng:

[assembly: InternalsVisibleTo ("MyCompany.SolutionName.ProjectName, PublicKey = Dán khóa công khai của bạn ở đây")]

/! \ bạn cần phải loại bỏ các ngắt dòng từ khóa công khai của bạn.

Nó hoạt động hoàn hảo cho tôi, vì vậy hy vọng nó sẽ thực hiện thủ thuật cho bạn!

+1

Cũng làm việc trong Visual Studio 2015 :) – Kzrystof

+0

Hữu ích. Cảm ơn. – qwertoyo

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