2012-01-31 24 views
5

Bạn có thể tạo phiên bản .NET 4 của ứng dụng để thử nghiệm là câu hỏi vô tội của ông chủ - chắc chắn!System.TypeLoadException không được xử lý/Quy tắc bảo mật thừa kế vi phạm trong khi ghi đè thành viên

Nhưng sau khi tôi đã thay đổi 27 dự án của chúng tôi trong ứng dụng Winforms của chúng tôi để NET 4, và biên dịch lại, khi khởi chạy ứng dụng, tôi nhận được

System.TypeLoadException là unhandled
nhắn = Inheritance các quy tắc bảo mật bị vi phạm trong khi ghi đè thành viên: 'MyCustomORM.GetObjectData (System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Khả năng truy cập bảo mật của phương thức ghi đè phải phù hợp với khả năng truy cập bảo mật của phương thức được ghi đè.

Hmmm .....

MyCustomORM không thực sự thực hiện các giao diện ISerializable và do đó có phương pháp này

[Serializable] 
public abstract class MyCustomORM: IMyCustomORM, ISerializable, ICloneable, ISecurable 
{ 
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     // do stuff here....... 
    } 
} 

và tôi cũng có hai lớp học có nguồn gốc từ Exception đó ghi đè lên GetObjectData phương pháp.

Nhưng điều gì có thể sai ở đây ?? Googling xung quanh tôi tìm thấy một số thuộc tính bổ sung để dính vào phương pháp và không gian tên của tôi - vì vậy tôi đã làm:

[assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution = true)] 
namespace MyApplication.ORM 
{ 
    [Serializable] 
    public abstract class MyCustomORM: IMyCustomORM, ISerializable, ICloneable, ISecurable 
    { 
     [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] 
     public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      // do stuff here....... 
     } 
    } 
} 

nhưng điều đó không thay đổi bất cứ điều gì .....

Trường hợp ngoại lệ xảy ra ngay cả trước khi dòng đầu tiên của tôi mã số trong phương pháp static Main() của tôi đã đạt được ....

Tôi đã lược thông qua dự án và xóa mọi tham chiếu tới thư viện .NET 1.1 cũ (có, ứng dụng cũ .....) và thay thế chúng với các đối tác .NET 4 của họ (chủ yếu là log4net). Vẫn không có may mắn ....

Bất kỳ ý tưởng nào ??

+1

Có 'cờ' để kiểm soát hành vi này. Không thể nhớ nơi mặc dù. Lỗi này cũng chỉ ra rằng bạn không thể sử dụng 'virtual' ở đó. – leppie

+0

Ngoài ra, 'GetObjectData' không thực sự có ý nghĩa trong một lớp trừu tượng, vì bạn sẽ không bao giờ có thể tái tạo nó (cho một thể hiện của một kiểu trừu tượng). – leppie

Trả lời

6

Lắp ráp trong đó lớp MyCustomORM có được đánh dấu bằng SecurityTransparentAttribute không? Nếu vậy, vấn đề bắt nguồn từ những thay đổi trong mô hình minh bạch bảo mật giữa .NET 3.5 và .NET 4.0. Đối với kịch bản thử nghiệm của bạn, bạn có thể chỉ muốn chọn sử dụng cơ chế minh bạch cũ hơn. Để làm như vậy, thêm thuộc tính lắp ráp cấp sau:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

Để biết thêm thông tin về sự khác biệt giữa các mô hình tính minh bạch Level1 và level2, xem http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx.

+1

Tất cả các hội đồng dường như có một thuộc tính '[assembly: AllowPartiallyTrustedCallers]' –

+0

Theo quy tắc Cấp 2, APTCA dẫn đến tất cả mã trong assembly được coi là minh bạch trừ khi được đánh dấu là quan trọng. Việc chỉ định các quy tắc Cấp 1 thông qua SecurityRulesAttribute sẽ giải quyết vấn đề trước mắt của bạn, giống như bạn đã sử dụng SecurityTransparentAttribute. –

1

Tôi biết điều này khá cũ, nhưng tôi đã gặp sự cố này với một trong những hội đồng của tôi gần đây. Nó chỉ xảy ra trên một số máy và rất khó xác định nguyên nhân gây ra nó. Tôi không chỉ muốn đưa các điều chỉnh quy tắc bảo mật vào, vì vậy sau nhiều lần tìm kiếm, tôi đã chạy qua công cụ SecAnnotate có trong Visual Studio.

Using SecAnnotate to Identify Transparency Violations

Sử dụng công cụ tôi đã có thể xác định rằng một trong những hội của tôi đã tham khảo một phiên bản cũ của một dll trong đó có một số thuộc tính bảo mật mà đã gây ra vấn đề. Cập nhật tham chiếu đã khắc phục sự cố.

Công cụ SecAnnotate có vẻ như một cách tuyệt vời để xác định mọi vi phạm mà bạn có thể đã vô tình bỏ qua hoặc không biết.

Hy vọng điều này sẽ giúp ai đó.

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