2012-07-12 126 views
25

我们有一个面向.Net Framework 4.0的Windows Form应用程序。安装.Net Framework 4.5后,应用程序开始崩溃。我们将不得不调查崩溃,我们很可能不得不解决我们的问题。但是,在我们准备使用.Net 4.5之前,我们可以打开一个设置来保留旧的行为吗?如果安装.Net 4.5,如何保持.net 4.0行为?


更新2012年7月12日: 我们发现,使我们的应用程序崩溃的重大更改:给定一个System.Threading.Timer,与手柄调用Dispose(WaitHandle的)时已是关闭,那么Timer会尝试发出抛出异常的WaitHandle信号。 Timer的.Net 4.0实现可以容忍,但4.5不是。

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

+0

您的项目是否设置为'.NET Framework 4.0'? – 2012-07-12 18:24:34

+0

@LeonCullens:是的。 – Sylvain 2012-07-12 18:27:30

+1

@Sly我来自.NET Framework兼容团队。你可以给我一个微软网络公司的netfx45compat上的repro,以便我可以看看吗? – Varun 2012-10-16 15:20:41

回答

29

但是有一个设置,我们可以打开以保持旧的行为,直到我们准备使用.Net 4.5?

编号.net 4.5是一个就地替换的.NET 4.当你安装它,你有效地运行在新的框架。

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

不幸的是,这意味着如果您想支持在安装了4.5且未安装4.5的计算机上运行,​​您(和其他人)将需要测试和修复这两个框架上的问题。幸运的是,突破性变化通常都是不寻常的,边缘情况,所以在大多数情况下不太可能影响大多数用户。

6

我通过电子邮件与原始问题海报 - “狡猾”讨论过。感谢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); 
    } 
相关问题