2012-07-01 8 views
34

मेरे पास निम्न (सी #) फ़ंक्शन निम्न जैसा है।सुरक्षा अपवाद: ईसीएल विधियों को सिस्टम मॉड्यूल में पैक किया जाना चाहिए

private static bool SpecialCase = false; 

public void Foo() 
{ 
    if (SpecialCase) 
    { 
     InternalMethod(); 
     return; 
    } 

    Console.WriteLine(); 
} 

[MethodImpl(MethodImplOptions.InternalCall)] 
private static extern void InternalMethod(); 

जब मैं डिबगर अंदर .NET फ्रेमवर्क 4 के साथ इस पर अमल, विधि सफलतापूर्वक कंसोल और रिटर्न के लिए रिक्त पंक्ति प्रिंट करता है। जब मैंने इसे डिबगर के बाहर निष्पादित, यह निम्न संदेश के साथ एक अपवाद फेंकता है:

System.Security.SecurityException: ECall methods must be packaged into a system module. 

ऐसा प्रतीत होता है जब JIT कम्पाइलर विधि को संकलित करता है के रूप में जब (यदि) InternalMethod कहा जाता है के लिए विरोध अपवाद फेंक दिया है। क्या सीआईएल को SecurityException फेंकने के लिए कुछ भी नहीं है (उदाहरण के लिए विशेषताएं), या विधि को वास्तव में बुलाए जाने तक अपवाद में देरी हो सकती है?

उपयोग मामले पर साइड नोट: SpecialCase फ़ील्ड प्रभावी रूप से झूठी है जब Microsoft .NET Framework के साथ चल रहा है, और सीएलआई के एक अलग (विशिष्ट) कार्यान्वयन के तहत चलते समय सही है। माइक्रोसॉफ्ट .NET Framework के तहत चलते समय, InternalMethod पर कॉल प्रभावी रूप से पहुंच योग्य नहीं है।

+0

क्या आप इसे सामान्य विधि में लपेट सकते हैं? – SLaks

+1

हां, ऐसा लगता है कि एक रैपर विधि को कॉल करना निम्नलिखित की तरह अपवाद से बचाता है। नकारात्मकता यह अभ्यास पहले से ही जटिल एल्गोरिदम में और भी भ्रमित कोड पथ का कारण बनता है, इसलिए यदि कोई पाया जा सकता है तो मैं क्लीनर समाधान पसंद करता हूं। 'निजी स्थिर शून्य InternalMethodWrapper() {InternalMethod(); } ' –

+0

बीटीडब्ल्यू यह' .NET 4.5.2' पर भी होता है लेकिन दोनों ढांचे में (दोनों ढांचे में वही 'सीएलआर' होता है) केवल 'रिलीज' में 'डीबग' में नहीं, क्या आपने 'डीबग' मोड में काम करने पर विचार किया था ? –

उत्तर

1

जोड़ें अपनी कक्षा घोषणा

2

आप compiler directives as a possible option जाँच करना चाहते हो सकता है [ComImport] जोड़कर देखते हैं। रन-टाइम "अगर" का उपयोग करने के विपरीत, यह निर्धारित करेगा कि कॉल को संकलित कोड में हमेशा शामिल किया गया है, बजाय इसे हमेशा कोड में संकलित करने और यह निर्धारित करने की कोशिश कर रहा है कि इसे रन-टाइम पर कॉल करना है (जो भी है देर से, आपके विश्लेषण के आधार पर)।

आपका उपयोग-केस एक परीक्षण/सत्यापन परिदृश्य की तरह प्रतीत होता है, जिसका अर्थ है कि आपको कोड में संकलित करने की आवश्यकता नहीं है, सिवाय इसके कि जब आंतरिक कॉल वास्तव में किया जाएगा।

ध्यान दें कि यदि आपके उपयोग-मामले में गैर-एनईटी रनटाइम शामिल है, तो आपको अधिक जानकारी प्रदान करनी चाहिए क्योंकि इससे सही उत्तर में काफी बदलाव हो सकता है।

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

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