2009-03-23 41 views
25

Tôi có một dự án C# và một dự án thử nghiệm với các bài kiểm tra đơn vị cho dự án chính. Tôi muốn có testable internal phương pháp và tôi muốn kiểm tra chúng mà không có một đối tượng Accessor ma thuật mà bạn có thể có với các dự án thử nghiệm Visual Studio. Tôi muốn sử dụng InternalsVisibleToAttribute nhưng mỗi lần tôi thực hiện, tôi phải quay lại và tìm cách thực hiện, tôi nhớ liên quan đến việc tạo các tệp quan trọng để ký các hội đồng và sau đó sử dụng sn.exe để lấy khóa công khai và vân vân.Có cách nào dễ dàng để sử dụng InternalsVisibleToAttribute?

  • Có một tiện ích tự động hóa quá trình tạo ra một tập tin SNK, thiết lập các dự án ký vào hội, chiết xuất khóa công khai, và áp dụng các InternalsVisibleTo thuộc tính?

  • Có cách nào để sử dụng thuộc tính mà không cần cụm đã ký không?

Trả lời

32

Bạn không cần phải sử dụng assembly được ký để sử dụng InternalsVisibleTo. Nếu bạn không sử dụng các assembly đã ký, bạn có thể chỉ cần nhập tên đầy đủ của assembly.

Vì vậy, nếu bạn muốn có quyền truy cập vào MyAssembly trong bạn kiểm tra lắp ráp (MyAssembly.Test) tất cả các bạn cần trong AssemblyInfo.cs cho MyAssembly là tên của lắp ráp thử nghiệm như thế này:

[assembly: InternalsVisibleTo("CompanyName.Project.MyAssembly.Test")] 
13

Brian là đúng, nhưng, offcourse trong một số trường hợp bạn có một hội đồng đã ký, và bạn muốn nhận được chìa khóa công khai của hội đồng đó.

Bắt khóa này thực sự là một vấn đề phức tạp.
Vì vậy, tôi đã thực hiện việc này:
Tôi đã tùy chỉnh các công cụ bên ngoài của mình trong VS.NET, để tôi có thể lấy khóa công khai của dự án hiện tại chỉ bằng một cú nhấp chuột.
Đây là cách nó được thực hiện:

  • Trong VS.NET, mở menu 'Tools' và bấm vào
  • Một cửa sổ 'Tools' được gọi là ' Công cụ bên ngoài' sẽ mở
  • Bấm vào Thêm
  • Đối với tiêu đề, gõ vào 'Get khóa công khai'
  • trong 'Command', gõ C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe
  • trong 'Arguments', gõ: -Tp $(TargetPath)
  • Hãy chắc chắn rằng bạn kiểm tra 'Sử dụng đầu ra cửa sổ' tùy chọn

Sau đó, bạn xây dựng dự án, và khi bạn nhấp vào 'Get khóa công khai', bạn sẽ thấy khóa công khai cho dự án này trong cửa sổ đầu ra.

+1

Tôi cũng đã sử dụng các công cụ như [phản xạ] (http://www.reflector.net/) và [ilspy] (http://wiki.sharpdevelop.net/ILSpy.ashx) để nhận được thông tin tương tự tốt –

3

Có một cách khác để gọi các phương thức nội bộ và đang sử dụng "Phản chiếu".

 BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; 

     MethodInfo minfo = typeof(BaseClassName).GetMethod("MethodName", bindingFlags); 
     BaseClassName b = new BaseClassName();    
     minfo.Invoke(b, null); 

Ở đây tôi giả định rằng "BaseClassName" là tên của lớp từ một thư viện lớp học khác và "MethodName" là tên của phương thức nội bộ.

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