मेरे पास निम्न (सी #) फ़ंक्शन निम्न जैसा है।सुरक्षा अपवाद: ईसीएल विधियों को सिस्टम मॉड्यूल में पैक किया जाना चाहिए
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
पर कॉल प्रभावी रूप से पहुंच योग्य नहीं है।
क्या आप इसे सामान्य विधि में लपेट सकते हैं? – SLaks
हां, ऐसा लगता है कि एक रैपर विधि को कॉल करना निम्नलिखित की तरह अपवाद से बचाता है। नकारात्मकता यह अभ्यास पहले से ही जटिल एल्गोरिदम में और भी भ्रमित कोड पथ का कारण बनता है, इसलिए यदि कोई पाया जा सकता है तो मैं क्लीनर समाधान पसंद करता हूं। 'निजी स्थिर शून्य InternalMethodWrapper() {InternalMethod(); } ' –
बीटीडब्ल्यू यह' .NET 4.5.2' पर भी होता है लेकिन दोनों ढांचे में (दोनों ढांचे में वही 'सीएलआर' होता है) केवल 'रिलीज' में 'डीबग' में नहीं, क्या आपने 'डीबग' मोड में काम करने पर विचार किया था ? –