2012-07-12 21 views
25

Mamy aplikację Windows Form, która jest przeznaczona dla .Net Framework 4.0. Po zainstalowaniu .Net Framework 4.5, aplikacja zaczyna się zawiesza. Będziemy musieli zbadać awarie i najprawdopodobniej będziemy musieli naprawić rzeczy po naszej stronie. Ale czy istnieje ustawienie, które można włączyć, aby zachować stare zachowanie, dopóki nie będziemy gotowi do korzystania z .Net 4.5?Jak zachować zachowanie .Net 4.0, jeśli .Net 4.5 jest zainstalowany?


Aktualizacja 12.07.2012: Okazało się, że zmiany, które powoduje rozerwanie naszą aplikację do katastrofy: Biorąc pod uwagę System.Threading.Timer, gdy wywołanie Dispose (WaitHandle) z uchwytem, ​​który został już zamknięty, a następnie Timer próbuje zasygnalizować WaitHandle, która zgłasza wyjątek. Implementacja Timera w .Net była tolerancyjna, ale 4.5 nie jest.

Na naszej stronie jest błąd; nie mamy żadnego powodu, aby go zamknąć, więc naprawimy to ... dopóki nie znajdziemy kolejnego błędu ...

+0

Czy Twoje projekty są ustawione na ".NET framework 4.0"? –

+0

@LeonCullens: Tak, są. – Sylvain

+1

@Sly Jestem z zespołu zgodności .NET Framework. Czy mógłbyś wysłać mi repro na netfx45compat w Microsoft dot com, aby mógłbym rzucić okiem? – Varun

Odpowiedz

29

Ale czy istnieje ustawienie, które można włączyć, aby zachować stare zachowanie, dopóki nie będziemy gotowi do korzystania z .Net 4.5?

Nie .NET 4.5 jest zastępowany na miejscu .NET 4. Po zainstalowaniu, skutecznie działa na nowej strukturze.

Ogólnie rzecz biorąc, powinna być całkowicie kompatybilna wstecz, ale istnieje few breaking changes.

Niestety, będzie to oznaczać, że ty (i wszyscy inni) będziecie musieli przetestować i rozwiązać problemy w obu frameworkach, jeśli chcecie wesprzeć działanie na maszynie z zainstalowanym 4.5 i bez zainstalowanego 4.5. Na szczęście zmiany łamania są zwykle nietypowymi, skrajnymi przypadkami, więc jest mało prawdopodobne, aby wpłynęły na większość użytkowników w większości scenariuszy.

6

Omówiłem to przez e-mail z oryginalnym plakatem z pytaniem - "Sly". Dzięki Sly za pomoc w zbadaniu sprawy. Okazuje się, że .NET4 i .NET4.5 zachowują się tak samo dla API Dispose (waithandle). Tak więc ten problem jest potencjalnie niezwiązany z .NET4.5.

static void Main(string[] args) 
    { 
     System.Threading.Timer timer = new System.Threading.Timer(new System.Threading.TimerCallback(blah)); 
     System.Threading.EventWaitHandle eventWaitHandle = new System.Threading.EventWaitHandle(true, System.Threading.EventResetMode.ManualReset); 

     eventWaitHandle.Dispose(); 
     System.Threading.Thread.Sleep(2000); 
     timer.Dispose(eventWaitHandle); 
    } 

    private static void blah(object state) 
    { 
     Console.WriteLine(40); 
    } 
Powiązane problemy