Подтвердить что ты не робот

Как сохранить поведение .Net 4.0, если установлен .Net 4.5?

У нас есть приложение Windows Form, которое предназначено для .NET Framework 4.0. После установки .Net Framework 4.5 приложение начинает сбой. Нам придется расследовать аварии, и нам, скорее всего, придется исправить ситуацию на нашей стороне. Но есть ли настройка, которую мы можем включить, чтобы сохранить прежнее поведение, пока мы не будем готовы использовать .Net 4.5?


Обновление 07/12/2012: Мы обнаружили нарушение, которое приводит к сбою нашего приложения: Учитывая System.Threading.Timer, при вызове Dispose (WaitHandle) с дескриптором, который уже был закрыт, таймер пытается сигнализировать WaitHandle, который выдает исключение. Версия Timer Timer была толерантна, но 4.5 - нет.

На нашей стороне есть ошибка; у нас нет веской причины, чтобы дать ему закрытую ручку, поэтому мы просто исправим это... пока не найдем другую ошибку...

4b9b3361

Ответ 1

Но есть ли настройка, которую мы можем включить, чтобы сохранить прежнее поведение, пока мы не будем готовы использовать .Net 4.5?

Нет..NET 4.5 является заменой .NET на месте. Когда вы его устанавливаете, вы эффективно работаете в новой среде.

В целом, он должен быть полностью обратно совместим, но есть несколько изменений.

К сожалению, это будет означать, что вам (и всем остальным) потребуется протестировать и устранить проблемы на обеих фреймворках, если вы хотите поддерживать работу на компьютере с установленным 4.5 и без установленного 4.5. К счастью, разрывные изменения, как правило, все необычные, краевые случаи, поэтому вряд ли это повлияет на большинство пользователей в большинстве сценариев.

Ответ 2

Я обсуждал это по электронной почте с оригинальным вопросником - "Sly". Спасибо Sly за помощь в расследовании. Оказывается, что .NET4 и .NET4.5 ведут себя одинаково для API Dispose (waithandle). Таким образом, эта проблема потенциально не связана с .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);
    }