हम हमारी परियोजनाओं में से एक में एक कक्षा में निम्न विधि:संकलन कुछ तरीकों में तय ब्लॉक के बाद कोड को छोड़ देता है
private unsafe void SomeMethod()
{
// Beginning of the method omitted for brevity
var nv = new Vector4[x];
fixed (Vector4* vp = nv)
{
fixed (float* tp = /* Source float ptr */)
{
fixed (double* ap = /* Source double ptr */)
{
for (var i = atlArray.Length - 1; i >= 0; --i)
{
vp[((i + 1) << 3) - 2] = new Vector4(tp[i], btt, 0.0f, 1.0f);
// Additional Vector4 construction omitted for brevity
nttp[i] = new Vector2(tp[i], this.ttvp);
nts[i] = string.Format(ap[i], /* etc. */);
}
}
}
}
this.ts = nts;
this.ttp = nttp;
this.V = nv; // <- This is a property setter
}
मैं इस अंधेरा करना पड़ा है, लेकिन उम्मीद है कि यह अभी भी काफी स्पष्ट एक पाने के लिए है क्या हो रहा है इसका विचार।
डीबग बिल्ड में हमारे डेवलपर्स मशीनों में से एक पर, सी # कंपाइलर fixed
ब्लॉक बंद होने के बाद होने वाले तीन असाइनमेंट को हटा देता है। यदि हम इन पंक्तियों पर ब्रेकपॉइंट डालने का प्रयास करते हैं, तो एप्लिकेशन प्रारंभ होने पर विधि के अंत में ब्रेसपॉइंट छोड़ देता है। कोड जो fixed
ब्लॉक के बीच प्रकट होता है और किसी विधि के अंत को अन्य विधियों में भी हटा दिया जाता है, लेकिन परेशान रूप से, उन सभी में नहीं।
कुछ प्रयोगों के बाद, हमने पाया कि प्रभावित परियोजना के अनुकूलन के कारण गायब कोड को शामिल किया गया। हालांकि, यह कार्य-कार्य हमारे यूनिट परीक्षण के लिए विफल रहता है - कोड गुम है, और प्रभावित परियोजना के अनुकूलन को बदलना और इसकी टेस्ट प्रोजेक्ट मदद नहीं करता है। हमने यह भी पाया कि आंतरिक-सबसे fixed
कथन के अंदर तीन असाइनमेंट को स्थानांतरित करना - यह स्पष्ट हो जाता है कि आईएल की जांच करते समय क्यों।
डिबग प्रभावित मशीन पर बनाया गया DLL में (अनुकूलन के साथ बंद कर दिया), एक वापसी सेशन सीधे दिखाई देने के बाद ap
ढेर बंद पॉपअप है:
IL_03a1: nop
IL_03a2: ldc.i4.0
IL_03a3: conv.u
IL_03a4: stloc.s ap
IL_03a6: ret
यही कारण है stloc
से पहले तीन कार्य आगे बढ़ निर्देश काम करता है। डिबग मेरी मशीन पर बनाया गया DLL में वापसी की उम्मीद सेशन जगह में होता है तीन कार्य के बाद:
IL_03a5: nop
IL_03a6: ldc.i4.0
IL_03a7: conv.u
IL_03a8: stloc.s ap
IL_03aa: nop
IL_03ab: ldc.i4.0
IL_03ac: conv.u
IL_03ad: stloc.s tp
IL_03af: nop
IL_03b0: ldc.i4.0
IL_03b1: conv.u
IL_03b2: stloc.s vp
IL_03b4: ldarg.0
IL_03b5: ldloc.s nts
IL_03b7: stfld string[] N.B.E.B::ts
IL_03bc: ldarg.0
IL_03bd: ldloc.s nttp
IL_03bf: stfld valuetype [SharpDX]SharpDX.Vector2[] N.B.E.B::ttp
IL_03c4: ldarg.0
IL_03c5: ldloc.s nv
IL_03c7: call instance void N.B.E.B::set_V(valuetype [SharpDX]SharpDX.Vector4[])
IL_03cc: nop
IL_03cd: ret
हम अब तक एक SSCCE उत्पादन करने में विफल रहा है - यह केवल बहुत विशिष्ट परिस्थितियों में प्रकट करने के लिए लगता है , और केवल हमारी परियोजनाओं में से एक में। हमने जांच की है कि विजुअल स्टूडियो, .NET फ्रेमवर्क के समान संस्करण, सी # कंपाइलर और एमएसबिल्ड दोनों मशीनों पर उपयोग किए जा रहे हैं। हमने ओएस संस्करण और अपडेट जैसे अन्य संभावित मतभेदों की जांच की है। दोनों मशीनों पर चीजें समान होती हैं (वे लैपटॉप का एक ही मॉडल हैं)। हम स्पष्ट रूप से थोड़ा परेशान हैं। कोई भी सहायताकाफी प्रशंसनीय होगी।
क्या Roslyn संकलक नहीं है? मेरे पास सी: \ उपयोगकर्ता \ Svick \ AppData \ Local \ Microsoft \ VisualStudio \ 12.0 \ एक्सटेंशन \ 2wcdsxyh.slm \ rcsc.exe में है। यदि ऐसा है, तो आप [इस बग को Roslyn टीम को रिपोर्ट करना चाहते हैं] (https://roslyn.codeplex.com/WorkItem/Create)। – svick
@ एसविक यह एक दिलचस्प लीड है - सोमवार को मेरे सहयोगी से मुझे पता चल जाएगा कि क्या उसने कभी रोज़लिन कंपेलर स्थापित किया है, और अगर उसने ऐसा किया तो रोज़लिन टीम को इस मुद्दे की रिपोर्ट करें। मैं वापस रिपोर्ट करूंगा। –