2011-08-25 16 views
8

tôi đang cố gắng để lộ một số internals cho dự án thử nghiệm đơn vị của tôi bằng cách sử dụng:Làm cách nào để tôi có thể làm cho thuộc tính InternalsVisibleTo hoạt động bằng cách ký một mã thông báo công khai một cách an toàn?

[assembly: InternalsVisibleTo("MyTest")] 

Nhưng tôi nhận được lỗi:

Error 1 Friend assembly reference MyTest' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations. .../MyClass.cs...

Khi tôi gán một PublicTokenKey bằng tay:

[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")] 

Giải pháp xây dựng mà không có bất kỳ lỗi nào.

  1. Tại sao tôi cần bao gồm mã thông báo khóa công khai?
  2. Tôi không chắc chắn liệu mình có vi phạm điều gì đó trong sản xuất hay không bằng cách đưa mã thông báo khóa công khai.

Vì vậy, cách tốt nhất và an toàn nhất để gán khóa công khai cho dự án Thử nghiệm của tôi là gì?

+0

Bạn không cần phải gán mã thông báo khóa công khai. Nhưng bạn cần phải chắc chắn rằng các tên lắp ráp phù hợp. – UrbanEsc

+0

Tôi đang sao chép dán tên lắp ráp từ trường Tên lắp ráp được hiển thị trong thuộc tính Dự án. Vì vậy, nó phải là chính xác, tôi gues .. – pencilCake

+0

Alright, vì vậy tôi havent gặp phải vấn đề bản thân mình, nhưng anh chàng này ở đây có thể có một tùy chọn cho bạn http://blog.tylerholmes.com/2008/04/unit-tests-and -internalsvisibleto.html – UrbanEsc

Trả lời

7

Tôi ngạc nhiên là PublicKeyToken thậm chí làm việc - trên máy tính của tôi nó buộc tôi phải sử dụng PublicKey

  1. Lý do mà bạn cần một mã thông báo khóa công khai là vì mạnh mẽ tên lắp ráp có thể được đưa vào GAC - có niềm tin cao. Nó sẽ là một lỗ hổng bảo mật nếu bất kỳ hội đồng nào được gọi là 'MyTest' (có khả năng không tin cậy - ví dụ: một điều khiển trong trình duyệt) có thể gọi vào nội bộ của một hội đồng GACed; nó muốn khóa công khai ngăn chặn kiểu tấn công này.

  2. Điều này sẽ không làm hỏng bất kỳ thứ gì trong sản xuất - ngay cả khi không thể tìm thấy lắp ráp. Thuộc tính này được sử dụng trong thời gian biên dịch và không chạy.

Cách an toàn nhất là gì?

Nếu bạn đang thực sự lo lắng về nó phá vỡ mã sản xuất, loại bỏ các thuộc tính trong phát hành xây dựng:

#if (DEBUG || TEST) 
[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")] 
#endif 

Nếu bạn có một vài dự án mà cần token khóa công khai (và bạn có một cặp khóa đơn , mà bạn nên) bạn cũng có thể định nghĩa một tập tin như AssemblyInfo.global.cs và thêm nó như là một tập tin có liên quan đến tất cả các dự án của bạn:

class KeyTokens 
{ 
    public const string Global = ", PublicKeyToken=XxxxxYysakf"; 
} 

này đơn giản hóa điều cần (đặc biệt nếu bạn cần phải sử dụng PublicKey mà là thực sự là dài):

#if (DEBUG || TEST) 
[assembly: InternalsVisibleTo("MyTest" + KeyTokens.Global)] 
[assembly: InternalsVisibleTo("HisTest" + KeyTokens.Global)] 
[assembly: InternalsVisibleTo("TheirTest" + KeyTokens.Global)] 
#endif 
+0

Thật không may, cách tiếp cận concatentation ngăn IntelliSense làm việc trong dự án "friend" VS (https://connect.microsoft.com/VisualStudio/feedback/details/542121/intellisense-warns-red-sqiggle-incorrectly-for-internalsvisibleattribute- set-by-a-constant, https://connect.microsoft.com/VisualStudio/feedback/details/108537/internalsvisibleto-intellisense-signed-assemblies). Cho đến khi/trừ khi điều này được khắc phục, cách tiếp cận liên tục được nối không thể tìm thấy ưu tiên với hầu hết người dùng tiềm năng. –

+0

@Nicole - lạ nó làm việc cho tôi, có thể bởi vì chúng tôi tham khảo các hội đồng bằng tập tin đầu ra ở đây và không phải dự án. –

+0

Nó chỉ ảnh hưởng đến tham chiếu dự án. Thật không may, các kịch bản mà các assembly của người bạn có xu hướng hữu ích nhất (các API bán riêng, phơi bày các nội bộ để kiểm tra) cũng là các kịch bản mà ở đó các folks có xu hướng thích sử dụng các tham chiếu dự án trong giải pháp. –