c# - .NET 4.5 बीटा में इस FatalExecutionEngineError का कारण क्या है?




clr (2)

नीचे नमूना कोड स्वाभाविक रूप से हुआ। अचानक मेरे कोड ने एक बहुत ही बुरा- FatalExecutionEngineError अपवाद दिया। मैंने अपराधी नमूना को अलग करने और कम करने की कोशिश करने में 30 मिनट का अच्छा समय बिताया। कंसोल ऐप के रूप में विजुअल स्टूडियो 2012 का उपयोग करके इसे संकलित करें:

class A<T>
{
    static A() { }

    public A() { string.Format("{0}", string.Empty); }
}

class B
{
    static void Main() { new A<object>(); }
}

इस त्रुटि को .NET Framework 4 और 4.5 पर उत्पन्न करना चाहिए:

क्या यह एक ज्ञात बग है, कारण क्या है और मैं इसे कम करने के लिए क्या कर सकता हूं? मेरा वर्तमान काम string.Empty उपयोग नहीं करना है। string.Empty , लेकिन क्या मैं गलत पेड़ को string.Empty रहा हूं? उस कोड के बारे में कुछ भी बदलना यह काम करता है जैसा कि आप उम्मीद करेंगे - उदाहरण के लिए A के खाली स्थिर कन्स्ट्रक्टर को हटा देना, या object से int तक टाइप पैरामीटर बदलना।

मैंने अपने लैपटॉप पर इस कोड की कोशिश की और शिकायत नहीं की। हालांकि, मैंने अपने मुख्य ऐप को आजमाया और यह लैपटॉप पर भी दुर्घटनाग्रस्त हो गया। समस्या को कम करते समय मुझे कुछ गड़बड़ करनी होगी, मैं देखूंगा कि क्या मैं यह पता लगा सकता हूं कि क्या था।

मेरा लैपटॉप फ्रेमवर्क 4.0 के साथ उपरोक्त कोड के साथ दुर्घटनाग्रस्त हो गया, लेकिन 4.5 के साथ भी मुख्य क्रैश। दोनों सिस्टम नवीनतम अपडेट (जुलाई?) के साथ वीएस'12 का उपयोग कर रहे हैं।

अधिक जानकारी :

  • आईएल कोड (संकलित डीबग / कोई भी सीपीयू / 4.0 / वीएस -2010 (क्या आईडीई को कोई फर्क नहीं पड़ता?)): http://codepad.org/boZDd98E
  • 4.0 के साथ वीएस 2010 नहीं देखा। ऑप्टिमाइज़ेशन के साथ / बिना क्रैशिंग, अलग-अलग लक्ष्य सीपीयू, डीबगर संलग्न / संलग्न नहीं, आदि - टिम मेडोरा
  • यदि मैं AnyCPU का उपयोग करता हूं तो 2010 में क्रैश, x86 में ठीक है। प्लेटफार्म लक्ष्य = AnyCPU का उपयोग करते हुए विजुअल स्टूडियो 2010 एसपी 1 में क्रैश, लेकिन प्लेटफार्म लक्ष्य = x86 के साथ ठीक है। इस मशीन में VS2012RC भी स्थापित है, इसलिए 4.5 संभवतः इन-प्लेस प्रतिस्थापन कर रहा है। AnyCPU और TargetPlatform = 3.5 का उपयोग करें, तो यह क्रैश नहीं होता है, इसलिए फ्रेमवर्क में एक रिग्रेशन की तरह दिखता है।
  • 4.0 के साथ वीएस -2010 में x86, x64 या AnyCPU पर पुन: उत्पन्न नहीं कर सकता। - Fuji
  • केवल x64 के लिए होता है, (2012rc, Fx4.5) - हेनक होल्टरमैन
  • Win8 आरपी पर वीएस2012 आरसी। प्रारंभ में .NET 4.5 को लक्षित करते समय इस एमडीए को नहीं देख रहा है। जब .NET 4.0 को लक्षित करने के लिए स्विच किया गया तो एमडीए दिखाई दिया। फिर .NET 4.5 पर वापस स्विच करने के बाद एमडीए बनी हुई है। - Wayne

मुझे दृढ़ता से संदेह है कि यह .NET 4.0 में इस अनुकूलन ( BeforeFieldInit से संबंधित) के कारण होता है।

अगर मुझे ठीक से याद है:

जब आप एक स्थिर कन्स्ट्रक्टर को स्पष्ट रूप से घोषित करते हैं, तो पहले beforefieldinit उत्सर्जित होता है, रनटाइम को बताता है कि स्थैतिक कन्स्ट्रक्टर किसी भी स्थिर सदस्य पहुंच से पहले चलाया जाना चाहिए

मेरा अनुमान:

मुझे लगता है कि उन्होंने किसी भी तरह से इस तथ्य को x64 जिटर पर खराब कर दिया है, ताकि जब एक अलग प्रकार के स्थैतिक सदस्य को उस वर्ग से एक्सेस किया जा सके जिसका अपना स्थिर निर्माता पहले से चल चुका है, तो यह किसी भी तरह से चल रहा है (या गलत क्रम में निष्पादित) स्थैतिक कन्स्ट्रक्टर - और इसलिए एक दुर्घटना का कारण बनता है। (आपको शून्य सूचक अपवाद नहीं मिलता है, शायद इसलिए कि यह शून्य-प्रारंभिक नहीं है।)

मैंने आपका कोड नहीं चलाया है, इसलिए यह हिस्सा गलत हो सकता है - लेकिन अगर मुझे एक और अनुमान लगाना पड़ा, तो मैं कहूंगा कि यह कुछ string.Format हो सकता है। string.Format (या Console.WriteLine , जो समान है) को आंतरिक रूप से एक्सेस करने की आवश्यकता है दुर्घटना का कारण बनता है, जैसे कि एक लोकेल- संबंधित वर्ग जिसे स्पष्ट स्थिर निर्माण की आवश्यकता होती है।

दोबारा, मैंने इसका परीक्षण नहीं किया है, लेकिन यह डेटा पर मेरा सबसे अच्छा अनुमान है।

मेरी परिकल्पना का परीक्षण करने के लिए स्वतंत्र महसूस करें और मुझे बताएं कि यह कैसा चल रहा है।


एक अवलोकन, लेकिन डॉटपीक डिकंपील्ड स्ट्रिंग दिखाता है। इस प्रकार लक्षण:

/// <summary>
/// Represents the empty string. This field is read-only.
/// </summary>
/// <filterpriority>1</filterpriority>
[__DynamicallyInvokable]
public static readonly string Empty;

internal sealed class __DynamicallyInvokableAttribute : Attribute
{
  [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
  public __DynamicallyInvokableAttribute()
  {
  }
}

यदि मैं विशेषता के बिना छोड़कर अपना खुद का Empty घोषित करता हूं, तो मुझे अब एमडीए नहीं मिलता है:

class A<T>
{
    static readonly string Empty;

    static A() { }

    public A()
    {
        string.Format("{0}", Empty);
    }
}




clr