c# - net fra framework 4.5 download




सी#'है' संरचना पर जांच प्रकार-विषम.NET 4.0 x86 अनुकूलन व्यवहार (4)

अपडेट करें: मैंने माइक्रोसॉफ्ट कनेक्ट के साथ एक बग रिपोर्ट दायर की है, कृपया इसके लिए वोट दें!

अपडेट 2: माइक्रोसॉफ्ट ने बग रिपोर्ट को निश्चित के रूप में चिह्नित किया है

माइक्रोसॉफ्ट द्वारा 18/08/2010 को 17:25 बजे पोस्ट किया गया

यह बग रनटाइम के भविष्य के संस्करण में तय किया जाएगा। मुझे डर है कि यह बताने में बहुत जल्दी है कि क्या यह सर्विस पैक या अगली बड़ी रिलीज में होगा।

VS2010 में अपग्रेड करने के बाद से मुझे 'है' कीवर्ड के साथ कुछ बहुत अजीब व्यवहार मिल रहा है।

नीचे दिया गया प्रोग्राम (test.cs) आउटपुट सही होता है जब डीबग मोड (x86 के लिए) में संकलित किया जाता है और जब x86 के लिए ऑप्टिमाइज़ेशन के साथ संकलित किया जाता है तो गलत होता है। X64 या AnyCPU में सभी संयोजनों को संकलित करना अपेक्षित परिणाम देता है, सत्य।

.NET 3.5 के तहत संकलन के सभी संयोजन अपेक्षित परिणाम देते हैं, सच है।

मैं कंपाइलर .NET ढांचे के विभिन्न संयोजनों का उपयोग करके कोड संकलित और परीक्षण करने के लिए नीचे बैच फ़ाइल (runtest.bat) का उपयोग कर रहा हूं।

  • क्या किसी और ने .NET 4.0 के तहत इस तरह की समस्याओं को देखा है?
  • क्या runtests.bat चलते समय हर कोई अपने कंप्यूटर पर वही व्यवहार देखता है?
  • @ $ @ # $ ??

  • क्या इसे ठीक करने का कोई तरीका है?

test.cs

using System;

public class Program
{
    public static bool IsGuid(object item)
    {
        return item is Guid;
    } 

    public static void Main()
    {
        Console.Write(IsGuid(Guid.NewGuid()));
    }
}

runtest.bat

@echo off

rem Usage:
rem   runtest         -- runs with csc.exe x86 .NET 4.0
rem   runtest 64      -- runs with csc.exe x64 .NET 4.0
rem   runtest v3.5    -- runs with csc.exe x86 .NET 3.5
rem   runtest v3.5 64 -- runs with csc.exe x64 .NET 3.5

set version=v4.0.30319
set platform=Framework

for %%a in (%*) do (
  if "%%a" == "64" (set platform=Framework64)
  if "%%a" == "v3.5" (set version=v3.5)
)

echo Compiler: %platform%\%version%\csc.exe
set csc="C:\Windows\Microsoft.NET\%platform%\%version%\csc.exe"

set make=%csc% /nologo /nowarn:1607 test.cs
rem CS1607: Referenced assembly targets a different processor
rem This happens if you compile for x64 using csc32, or x86 using csc64

%make% /platform:x86
test.exe
echo  =^> x86

%make% /platform:x86 /optimize
test.exe
echo  =^> x86 (Optimized)

%make% /platform:x86 /debug
test.exe
echo  =^> x86 (Debug)

%make% /platform:x86 /debug /optimize
test.exe
echo  =^> x86 (Debug + Optimized)

%make% /platform:x64
test.exe
echo  =^> x64

%make% /platform:x64 /optimize
test.exe
echo  =^> x64 (Optimized)

%make% /platform:x64 /debug
test.exe
echo  =^> x64 (Debug)

%make% /platform:x64 /debug /optimize
test.exe
echo  =^> x64 (Debug + Optimized)

%make% /platform:AnyCPU
test.exe
echo  =^> AnyCPU

%make% /platform:AnyCPU /optimize
test.exe
echo  =^> AnyCPU (Optimized)

%make% /platform:AnyCPU /debug
test.exe
echo  =^> AnyCPU (Debug)

%make% /platform:AnyCPU /debug /optimize
test.exe
echo  =^> AnyCPU (Debug + Optimized)

परीक्षण के परिणाम

Runtest.bat चलाते समय मुझे अपने Win7 x64 इंस्टॉल पर निम्न परिणाम मिलते हैं।

> runtest 32 v4.0
Compiler: Framework\v4.0.30319\csc.exe
False => x86
False => x86 (Optimized)
True => x86 (Debug)
False => x86 (Debug + Optimized)
True => x64
True => x64 (Optimized)
True => x64 (Debug)
True => x64 (Debug + Optimized)
True => AnyCPU
True => AnyCPU (Optimized)
True => AnyCPU (Debug)
True => AnyCPU (Debug + Optimized)

> runtest 64 v4.0
Compiler: Framework64\v4.0.30319\csc.exe
False => x86
False => x86 (Optimized)
True => x86 (Debug)
False => x86 (Debug + Optimized)
True => x64
True => x64 (Optimized)
True => x64 (Debug)
True => x64 (Debug + Optimized)
True => AnyCPU
True => AnyCPU (Optimized)
True => AnyCPU (Debug)
True => AnyCPU (Debug + Optimized)

> runtest 32 v3.5
Compiler: Framework\v3.5\csc.exe
True => x86
True => x86 (Optimized)
True => x86 (Debug)
True => x86 (Debug + Optimized)
True => x64
True => x64 (Optimized)
True => x64 (Debug)
True => x64 (Debug + Optimized)
True => AnyCPU
True => AnyCPU (Optimized)
True => AnyCPU (Debug)
True => AnyCPU (Debug + Optimized)

> runtest 64 v3.5
Compiler: Framework64\v3.5\csc.exe
True => x86
True => x86 (Optimized)
True => x86 (Debug)
True => x86 (Debug + Optimized)
True => x64
True => x64 (Optimized)
True => x64 (Debug)
True => x64 (Debug + Optimized)
True => AnyCPU
True => AnyCPU (Optimized)
True => AnyCPU (Debug)
True => AnyCPU (Debug + Optimized)

tl; डॉ


अपने अंतिम प्रश्न का उत्तर देने के लिए आप MethodImpl विकल्प के साथ MethodImpl विशेषता जोड़ सकते हैं। समस्या को ठीक करने के लिए एक IsGuid रूप में अपनी IsGuid विधि में शामिल करना।

मैंने अभी .NET 4.0 पर x86 के लिए डीबग और रिलीज कॉन्फ़िगरेशन के बीच स्विच करने का एक सरल परीक्षण किया है और यह समस्या को हल करने लगता है। मैंने अभी तक अपने रनटेस्ट नहीं चलाए हैं। हालांकि।

अगर आपको अभी तक सबमिट नहीं किया गया है और इसे अपने प्रश्न से लिंक किया गया है तो आपको कनेक्ट में कोई समस्या भी जमा करनी चाहिए।


एक्सपी एसपी 3 (x86) पर मेरे परिणाम यहां दिए गए हैं:

>runtest
Compiler: Framework\v4.0.30319\csc.exe
False => x86
False => x86 (Optimized)
True => x86 (Debug)
False => x86 (Debug + Optimized)
False => AnyCPU
False => AnyCPU (Optimized)
True => AnyCPU (Debug)
False => AnyCPU (Debug + Optimized)

>runtest v3.5
Compiler: Framework\v3.5\csc.exe
True => x86
True => x86 (Optimized)
True => x86 (Debug)
True => x86 (Debug + Optimized)
True => AnyCPU
True => AnyCPU (Optimized)
True => AnyCPU (Debug)
True => AnyCPU (Debug + Optimized)

इस परिणाम के बारे में दिलचस्प बिंदु यह है कि .NET 4 लक्ष्य AnyCPU (x86 के रूप में चल रहा है) पर विफल रहता है लेकिन AnyCPU पर काम करता है (x64 के रूप में चल रहा है)।


दिलचस्प है कि यह सही ढंग से काम करता है:

using System;
public class Program
{
    public static bool IsGuid(object item)
    {
        return item is Guid;
    }

    public static void Main()
    {
        Guid s = Guid.NewGuid();
        Console.Write(IsGuid(s));
    }
}

आईएल में अंतर यहां है:

.method public hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       23 (0x17)
  .maxstack  1
  .locals init (valuetype [mscorlib]System.Guid V_0)
  IL_0000:  call       valuetype [mscorlib]System.Guid [mscorlib]System.Guid::NewGuid()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  box        [mscorlib]System.Guid
  IL_000c:  call       bool Program::IsGuid(object)
  IL_0011:  call       void [mscorlib]System.Console::Write(bool)
  IL_0016:  ret
} // end of method Program::Main

मैंने एक समान उदाहरण तैयार किया जो उसी तरह विफल रहता है:

using System;
using System.Runtime.CompilerServices;

public class Program {
  static void Main() {
    Console.Write(Verify(Test.Create()));
    Console.ReadLine();
  }
  //[MethodImpl(MethodImplOptions.NoInlining)]
  static bool Verify(IDisposable item) {
    return item is Test;
  }
  struct Test : IDisposable {
    public void Dispose() { }
    public static Test Create() { return new Test(); }
  }
}

यह एक जेआईटी अनुकूलक बग है। उस पर उंगली नहीं डाल सकती है, यह कोड को भारी रूप से अनुकूलित करता है। लेकिन ऐसा लगता है कि यह मुक्केबाजी रूपांतरण को अनुकूलित करते समय परेशानी में पड़ता है। स्पष्ट रूप से गंभीर गंभीर बग।

यह बग तय कर दिया गया है, मैं इसे अब repro नहीं कर सकता। Clrjit.dll का मेरा वर्तमान संस्करण 17 मई 2011 को 4.0.3031 9.237 है। मैं यह नहीं बता सकता कि वास्तव में किस अपडेट की मरम्मत हुई। मुझे 5 अगस्त 2011 को एक सुरक्षा अद्यतन मिला जिसने 12 अप्रैल की तारीख के साथ 235 में संशोधन करने के लिए clrjit.dll को अद्यतन किया, जो जल्द से जल्द होगा।





struct