2016-07-11 10 views
16

में विफल हो गई है, मैंने कुछ अजीब बातों में ठोकर खाई: मुझे BadImageFormatException मिला बिना यह जानने के बिना कि कौन सी छवि (असेंबली) संभवतः संदर्भित हो सकती है।कंपाइलर बग? जिसके परिणामस्वरूप एक खराब छवि है जो PEVerify

मैं समाधान कम इतना है कि यह केवल कोई निर्भरता के साथ एक एकल परियोजना के होते हैं:

enter image description here

आप देख सकते हैं, यह केवल System (और mscorlib) का उपयोग करता है, और निश्चित रूप से मैं डॉन ' रन समय पर असेंबली लोड करें।

यह सीई 6 के साथ .NET 4.5.2, वीएस 2015 के साथ AnyCpu के रूप में संकलित करता है, हालांकि इनमें से कोई भी वास्तव में मायने रखता नहीं है।

मैंने सी # 5 के साथ नमूना बनाने की कोशिश की, लेकिन एक बार जब मैं सभी "?" को प्रतिस्थापित करता हूं ऑपरेटर, यह हो रहा है।

git clone -b crash-sample https://github.com/jtheisen/moldinium.git 

मैं साफ-बनाया गया है और 4 मशीनों पर यह परीक्षण किया है, सभी एक ही प्रभाव दिखा:

मैं इतना है कि लोगों को यह खुद को कोशिश कर सकते हैं परियोजना की मेजबानी की है।

दुर्घटना के स्टैक ट्रेस है:

[IL]: Error: [C:\Source\Repos\moldinium\ConsoleApplication1\bin\Debug\Bad.exe : IronStone.Moldinium.LiveList+<>c__DisplayClass10_0`1[TSource]::b__2][offset 0x0000013B] Unable to resolve token.

Select.cs फ़ाइल से सभी ?. ऑपरेटरों निकाला जा रहा है समस्या का समाधान:

Ex.: System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 
    at IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2(ListEvent`1 v) 
    at IronStone.Moldinium.ActionObserver`1.OnNext(T value) in C:\Source\Repos\moldinium\ConsoleApplication1\Rx.cs:line 51 
...snipped... 

उत्पादन पर PEVerify चल रहा है निम्न त्रुटि पैदा करता है ।

ILSpy का उपयोग करते हुए मैं करने के लिए समस्या अलग-थलग कर दिया है: एक सार here में

IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2 

आप विधि के आईएल डंप देख सकते हैं (ILSpy के माध्यम से)। खराब आईएल ?. का उपयोग करते समय गुड आईएल सी # 5.0 शैली है।

यह VS2015.3

CSC Version: Microsoft (R) Visual C# Compiler version 1.3.1.60616

+1

@ डेवशॉ ऐसा लगता है कि मैं आपको भाग्यशाली हूं। मैं यहाँ अपनी गहराई से बाहर हूँ। – John

+0

मैंने प्रश्न फिर से लिखा है और संकलक बग और रनटाइम दुर्घटना के बारे में कम होने के लिए मेरी टिप्पणियों को शामिल किया है। – DaveShaw

+2

आप इसे https://github.com/dotnet/roslyn/issues –

उत्तर

3

साथ निर्माण यह वास्तव में एक बग है क्योंकि मैं तुम्हें मदद नहीं कर सकता किया गया है। लेकिन मैं आपको उस बिंदु पर ले जा सकता हूं जहां बग होता है और यह आपको कोड की कुछ पंक्तियों में बग को पुन: पेश करने में मदद कर सकता है।

namespace ElvisBugInNullableGenericStructWithNestedTypeParameter 
{ 
    struct MyGenericStruct<T> { } 
    class Program 
    { 
     static void Main() { } 

     void Test<T>() 
     { 
      Func<T, bool> func = (arg => 
       { 
        MyGenericStruct<T>? v1 = null; 
        return v1?.ToString() == null; 
       }); 
     } 
    } 
} 

अगर मैं MyGenericStruct<int>? साथ MyGenericStruct<T>? बदल देगा यह काम करेंगे।

समस्या यह है कि, किसी कारण से, जब हम बाहरी T को निरर्थक संरचना में उपयोग करते हैं और फिर हम एल्विस ऑपरेटर ? का उपयोग करने का प्रयास करते हैं तो यह प्रकार अज्ञात है (टोकन को हल करने में असमर्थ)।

अद्यतन आप अपने मामले को ठीक करना चाहते हैं, तो आप सिर्फ public static ILiveList<TSource> Where<TSource>(this ILiveList<TSource> source, Func<TSource, Boolean> predicate) विधि के भीतर Subscribe कार्रवाई से उन्हें हटाने, सभी एल्विस ऑपरेटर को दूर करने की जरूरत नहीं है।

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