2012-01-31 36 views
5

परीक्षण करने के लिए आप अपने ऐप का .NET 4 संस्करण बना सकते हैं, मालिकों का निर्दोष प्रश्न - निश्चित रूप से!System.TypeLoadException को अनचाहे किया गया था/विरासत सुरक्षा नियमों का उल्लंघन किया गया था जबकि सदस्य

लेकिन उसके बाद मैं नेट 4 के लिए हमारी Winforms आवेदन में हमारे 27 परियोजनाओं बदल गया है, और फिर कंपाइल, जब एप्लिकेशन को लॉन्च करने, मैं

System.TypeLoadException बिना क्रिया
संदेश = विरासत था मिल सदस्यों को ओवरराइड करते समय सुरक्षा नियमों का उल्लंघन किया गया: 'MyCustomORM.GetObjectData (System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'। ओवरराइडिंग विधि की सुरक्षा पहुंच को ओवरराइड होने वाली विधि की सुरक्षा पहुंच से मेल खाना चाहिए।

हममम .....

MyCustomORM वास्तव में ISerializable इंटरफ़ेस को लागू करता है और इस प्रकार इस विधि

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

है और मैं भी दो वर्गों है कि Exception से निकाले जाते हैं कि GetObjectData ओवरराइड है तरीका।

लेकिन यहां क्या गलत हो सकता है ?? चारों ओर Googling मैं अपने विधि और नाम स्थान पर छड़ी के लिए कुछ अतिरिक्त विशेषताओं पाया - तो मैंने किया:

[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....... 
     } 
    } 
} 

लेकिन वह कुछ भी नहीं बदलता है .....

अपवाद मेरी पहली पंक्ति से पहले भी होता है मेरे static Main() विधि में कोड का उपयोग किया गया है ....

मैंने प्रोजेक्ट के माध्यम से काम किया है और पुराने .NET 1.1 पुस्तकालयों (हाँ, ऐप पुराना है .....) के किसी भी संदर्भ को हटा दिया है और उन्हें बदल दिया है उनके .NET 4 समकक्षों (ज्यादातर log4net) के साथ। अभी भी कोई भाग्य नहीं ....

कोई विचार ??

+1

इस व्यवहार को नियंत्रित करने के लिए 'ध्वज' है। हालांकि याद नहीं कर सकते हैं। त्रुटि यह भी इंगित करती है कि आप वहां 'आभासी' का उपयोग नहीं कर सकते हैं। – leppie

+0

इसके अलावा, 'GetObjectData' वास्तव में एक अमूर्त वर्ग में समझ में नहीं आता है, क्योंकि आप कभी भी इसे फिर से चालू नहीं कर पाएंगे (एक सार प्रकार के उदाहरण के लिए)। – leppie

उत्तर

6

क्या असेंबली है जिसमें MyCustomORM क्लास सुरक्षा ट्रांस्पेरेंट एट्रिब्यूट के साथ चिह्नित है? यदि ऐसा है, तो समस्या .NET 3.5 और .NET 4.0 के बीच सुरक्षा पारदर्शिता मॉडल में परिवर्तनों से उत्पन्न होती है। अपने परीक्षण परिदृश्य के लिए, आप बस पुरानी पारदर्शिता तंत्र का उपयोग करने का विकल्प चुन सकते हैं। ऐसा करने के लिए, निम्न विधानसभा स्तरीय विशेषता जोड़ें:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

Level1 और Level2 पारदर्शिता मॉडल के बीच मतभेदों के बारे में अधिक जानकारी के लिए, http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx देखते हैं।

+1

सभी असेंबली में एक विशेषता '[असेंबली: AllowPartiallyTrustedCallers] ' –

+0

लेवल 2 नियमों के तहत प्रतीत होता है, एपीटीसीए परिणाम को असेंबली में सभी कोड में पारदर्शी माना जाता है जब तक कि महत्वपूर्ण के रूप में चिह्नित नहीं किया जाता है। SecurityRulesAttribute के माध्यम से स्तर 1 नियम निर्दिष्ट करना आपकी तत्काल समस्या का समाधान करना चाहिए, जैसे कि आपने SecurityTransparentAttribute का उपयोग किया था। –

1

मुझे पता है कि यह बहुत पुराना है, लेकिन मैं हाल ही में अपने एक असेंबली के साथ इस मुद्दे में भाग गया। यह केवल कुछ मशीनों पर हुआ और यह निर्धारित करना बहुत मुश्किल था कि इसका कारण क्या था। मैं सिर्फ सुरक्षा नियम समायोजन नहीं करना चाहता था, इसलिए बहुत सी खोज के बाद मैं विजुअल स्टूडियो के साथ शामिल SecAnnotate टूल में भाग गया।

Using SecAnnotate to Identify Transparency Violations

उपकरण मैं निर्धारित करने के लिए है कि मेरे विधानसभाओं में से एक एक dll जो कुछ सुरक्षा विशेषताएं हैं जिन्हें समस्या पैदा कर रहे थे निहित के एक पुराने संस्करण को संदर्भित किया गया था कर रहा था का उपयोग करना। संदर्भ को अद्यतन करने से समस्या को हल किया गया।

SecAnnotate उपकरण किसी भी उल्लंघन की पहचान करने के लिए एक शानदार तरीका प्रतीत होता है जिसे आपने गलती से अनदेखा किया है या नहीं पता था।

उम्मीद है कि यह किसी की मदद करेगा।

संबंधित मुद्दे