2009-09-18 17 views
10

https://msdn.microsoft.com/en-us/library/ms182161.aspxLớp NativeMethods có được xử lý đặc biệt trong .NET không?

Có ba lớp được mô tả trong phân trang này được xử lý đặc biệt trong Khuôn khổ .NET không? (NativeMethods, SafeNativeMethods và UnsafeNativeMethods)

Lý do tôi hỏi là tôi tự hỏi liệu có ổn không khi tạo ra các loại lớp NativeMethods. Ví dụ:

ComNativeMethods 
User32NativeMethods 
OleStorageNativeMethods 

Trả lời

7

Đó là một quy ước, không một yêu cầu. Nếu bạn phản ánh vào CLR và xem mã trong đó, bạn sẽ thường thấy P/Invoke code bên trong một lớp NativeMethods. Tôi tin rằng FxCop sẽ khuyên bạn nên đặt mã P/Invoke của bạn trong một lớp như thế này nếu nó gặp nó.

1

Chúng không được CLR xử lý đặc biệt. Nó chỉ đơn giản là khuyến cáo thực hành để có P/Invokes của bạn bên trong một lớp có tên là NativeMethods, SafeNativeMethods, hoặc UnsafeNativeMethods.

Bạn sẽ thấy đề xuất này có hiệu lực nếu bạn chạy FxCop trên các hội đồng của mình.

2

Nó chỉ là một ước nói rằng bạn nên đặt p/gọi các phương pháp trong lớp tên * NativeMethods, nhưng không có hạn chế về kỹ thuật để ngăn cản bạn làm nó theo cách riêng của bạn ...

2

Bạn có thể đặt tên cho lớp của mình theo cách đó, nhưng bạn sẽ tiếp tục nhận được cảnh báo phân tích mã CA1060. Cảnh báo này cho biết bạn không tuân theo quy ước. Vì vậy, để ngăn chặn cảnh báo này, bạn cần phải thực hiện theo quy ước khi đặt tên các lớp có các phương thức P/Invoke. Nếu bạn muốn phân loại các phương thức P/Invoke của mình, bạn có thể sử dụng các không gian tên. Ví dụ:

  • MyProject.Com.NativeMethods
  • MyProject.User32.NativeMethods
  • MyProject.OleStorage.NativeMethods
+0

giải thích của tôi về liên kết mà là nó là một quy ước, không phải là thời gian chạy không có gì khác biệt. Nhà phát triển chịu trách nhiệm đưa các thuộc tính bảo mật thích hợp vào các lớp. Ví dụ: "NativeMethods - Lớp này không ngăn chặn truy cập stack cho phép mã không được quản lý. (System.Security.SuppressUnmanagedCodeSecurityAttribute không được áp dụng cho lớp này.)" –

+0

Cũng có liên quan: "Các lớp này giống với lớp NativeMethods, tuy nhiên, chúng được đánh dấu bằng cách sử dụng một thuộc tính đặc biệt được gọi là SuppressUnmanagedCodeSecurityAttribute Khi thuộc tính này được áp dụng, thời gian chạy không thực hiện một bước đi đầy đủ để đảm bảo rằng tất cả người gọi có quyền UnmanagedCode.Thời gian chạy thường kiểm tra sự cho phép này khi khởi động. bạn nên sử dụng thuộc tính này một cách cẩn trọng. Nó có thể có những tác động bảo mật nghiêm trọng nếu nó được triển khai không chính xác .. " –

+0

Cảm ơn bạn, tôi đã sửa chữa. Tôi đã cập nhật câu trả lời của mình. –

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