25

.Net Framework 4.0 を対象とする Windows フォーム アプリケーションがあります。.Net Framework 4.5 をインストールすると、アプリケーションがクラッシュし始めます。クラッシュを調査する必要があり、おそらく私たちの側で問題を修正する必要があります. しかし、.Net 4.5 を使用する準備が整うまで、古い動作を維持するためにオンにできる設定はありますか?


2012 年 7 月 12 日更新: アプリケーションがクラッシュする重大な変更が見つかりました: System.Threading.Timer が与えられた場合、既に閉じられているハンドルで Dispose(WaitHandle) を呼び出すと、Timer は WaitHandle にシグナルを送ろうとします。これは例外をスローします。Timer の .Net 4.0 実装はそれに対して寛容でしたが、4.5 はそうではありません。

私たちの側にバグがあります。閉じたハンドルを与える正当な理由がないので、それを修正します...別のバグが見つかるまで...

4

2 に答える 2

29

しかし、.Net 4.5 を使用する準備が整うまで、古い動作を維持するためにオンにできる設定はありますか?

いいえ。.NET 4.5 は .NET 4 のインプレース置換です。インストールすると、新しいフレームワークで効果的に実行されます。

一般に、完全な下位互換性があるはずですが、破壊的な変更がいくつかあります。

残念ながら、これは、4.5 がインストールされているマシンと 4.5 がインストールされていないマシンでの実行をサポートしたい場合、あなた (および他のすべての人) が両方のフレームワークで問題をテストして修正する必要があることを意味します。幸いなことに、重大な変更は通常、すべて異常なエッジ ケースであるため、ほとんどのシナリオでほとんどのユーザーに影響を与える可能性は低いです。

于 2012-07-12T18:26:11.580 に答える
6

これについては、元の質問ポスター「Sly」とメールで話し合いました。調査に協力してくれたSlyに感謝します。.NET4と.NET4.5は、Dispose(waithandle)APIに対して同じように動作することがわかりました。したがって、この問題は.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);
    }
于 2012-11-11T00:40:56.010 に答える