【问题标题】:How to keep .Net 4.0 behavior if .Net 4.5 is installed?如果安装了 .Net 4.5,如何保持 .Net 4.0 的行为?
【发布时间】:2012-07-12 18:22:40
【问题描述】:

我们有一个面向 .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 不能。

我们这边有一个错误;我们没有任何充分的理由给它一个关闭的句柄,所以我们会修复它......直到我们发现另一个错误......

【问题讨论】:

  • 您的项目是否设置为“.NET framework 4.0”?
  • @Sly 我来自 .NET Framework 兼容性团队。能否给我发一份关于 Microsoft dot com 的 netfx45compat 的复制品,以便我看一看?
  • @Varun:repro 是我写的。只需将关闭的 WaitHandle 实例传递给 Dispose 方法或 Timer。
  • @Sly 你能通过 Microsoft dot com 的 netfx45compat 与我联系吗?
  • @Sly:你应该发布你的更新作为这个问题的答案。

标签: .net .net-4.5


【解决方案1】:

但是在我们准备好使用 .Net 4.5 之前,我们可以打开一个设置来保持旧的行为吗?

没有。 .NET 4.5 是 .NET 4 的就地替代品。安装它时,您实际上是在新框架上运行。

一般来说,它应该是完全向后兼容的,但是有一个few breaking changes

不幸的是,这意味着如果您想支持在安装了 4.5 和未安装 4.5 的机器上运行,您(和其他所有人)将需要测试和修复这两个框架上的问题。幸运的是,重大更改通常都是不寻常的边缘情况,因此在大多数情况下不太可能影响大多数用户。

【讨论】:

    【解决方案2】:

    我通过电子邮件与原始问题海报 - “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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      相关资源
      最近更新 更多