2010-06-15 22 views
7

Tôi đang tìm cách lọc ra các phương pháp có công cụ sửa đổi unsafe thông qua phản ánh. Nó không có vẻ là một thuộc tính phương thức.Xác định xem phương pháp không an toàn thông qua phản ánh

Có cách nào không?

CHỈNH SỬA: có vẻ như thông tin này không có trong siêu dữ liệu, ít nhất tôi không thể nhìn thấy thông tin đó trong IL. Tuy nhiên, phản xạ hiển thị công cụ sửa đổi unsafe trong chế độ xem C#. Bất kỳ ý tưởng về cách nó được thực hiện?

EDIT 2: Đối với nhu cầu của tôi, tôi đã kết thúc bằng một kiểm tra, giả định rằng nếu một trong các tham số của phương thức là con trỏ hoặc kiểu trả về là con trỏ thì phương thức này không an toàn.

public static bool IsUnsafe(this MethodInfo methodInfo) 
    { 
     if (HasUnsafeParameters(methodInfo)) 
     { 
      return true; 
     } 

     return methodInfo.ReturnType.IsPointer; 
    } 

    private static bool HasUnsafeParameters(MethodBase methodBase) 
    { 
     var parameters = methodBase.GetParameters(); 
     bool hasUnsafe = parameters.Any(p => p.ParameterType.IsPointer); 

     return hasUnsafe; 
    } 

Điều này không xử lý, tất nhiên, tôi chỉ quan tâm đến chữ ký của phương thức.

Cảm ơn!

+0

Lý do muốn làm điều này là gì? Có lẽ có một sự thay thế. – GenericTypeTea

+0

@GenericTypeTôi đang thực hiện một số tạo mã thông qua CodeDom. Nó không hỗ trợ tạo từ khóa 'unsafe', vì vậy tôi muốn bỏ qua các kiểu có phương thức' unsafe'. –

+0

Tôi đoán từ khóa không an toàn chỉ là một cờ nói với trình biên dịch: không tạo ra lỗi biên dịch ở đây vì tôi dự định sử dụng mã không an toàn. Reflector có thể phát hiện mã không an toàn và thêm từ khóa sau đó. Tôi nhận thấy nếu bạn sử dụng một khối không an toàn trong một phương pháp "an toàn", các từ khóa không an toàn trong Reflector được tạo ra trong khai báo phương pháp, do đó, nó không tạo ra một khối cho điều đó. Vì vậy, câu trả lời ở đây là: nếu Reflector có thể phát hiện mã không an toàn trong mscorlib, bạn cũng có thể ... – Koen

Trả lời

4

Thật không may, từ khóa không an toàn chỉ đơn giản là bao bọc phần thân của phương thức trong khối không an toàn và không phát ra bất cứ thứ gì mà sự phản chiếu sẽ thấy. Cách duy nhất để chắc chắn là phải tháo rời phương thức và xem liệu có bất kỳ hoạt động không an toàn nào bên trong hay không.

+0

Tôi cũng nghĩ rằng nếu bạn có thể thấy nó với sự phản ánh, họ sẽ có một tài sản cho chúng tôi trên MethodInfo ... – Koen

+1

It'd được tốt đẹp, nhưng tiếc là các từ khóa không an toàn là một điều C#, không phải là một điều IL. IL có các hoạt động không an toàn nhưng không có khái niệm về từ khóa không an toàn. –

+0

Cảm ơn, Adam. Tôi chấp nhận câu trả lời này bởi vì đây là kết luận mà tôi đã đạt được. –

0

Đừng nghĩ rằng có cách nào đó ra khỏi hộp. Nếu mã bạn phản ánh là của bạn, bạn có thể tạo riêng của mình UnsafeAttribute và gắn thẻ các phương pháp đó với thuộc tính và lọc trên ...

+0

Cảm ơn, nhưng tôi thực sự đang cố gắng lọc các loại 'mscorlib' của chúng tôi ... –

2

Đó là công việc của người xác minh IL. PEVerify.exe trong thư mục bin của Windows SDK. Nó xác minh IL trong cơ quan phương pháp và cờ không an toàn IL. Con trỏ, chủ yếu. Bạn sẽ nhận được một danh sách khá lớn nếu bạn để cho nó lỏng lẻo trên assembly system.dll.

Lưu ý rằng nó từ chối xác minh mscorlib.dll, bạn đang khá khó khăn nếu đó là một trong những bạn quan tâm. Sao chép và đổi tên nó không giúp ích gì.

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