我接手了一个包含大量旧代码的项目,其中包括C++和C#,目前在Windows 7上使用VS 2010进行编译。
当我构建我的解决方案时,令人惊讶的是有143个项目成功构建。但是,警告数量还是很多。其中一些警告是关于弃用函数的,数量相当惊人。
warning CS0618: 'System.Runtime.InteropServices.UCOMIMoniker' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIEnumMoniker' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIRunningObjectTable' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIRunningObjectTable' is obsolete
warning CS0618: 'System.Runtime.InteropServices.UCOMIBindCtx' is obsolete
warning CS0618: 'System.IO.Path.InvalidPathChars' is obsolete
warning CS0618: 'System.Configuration.ConfigurationSettings.AppSettings' is obsolete
warning CS0618: 'System.Net.Dns.GetHostByName(string)' is obsolete
这是什么意思?这些函数显然仍然被定义,否则它们将无法编译或会给我一些“未找到”或“未定义”的错误。这些函数的实现是否缺失?这些函数是否仍然像以前一样有效?
我查了几个函数,它们已经过时很长时间了。例如,GetHostByName:
.NET Framework
Supported in: 1.1
Obsolete (compiler warning) in 4.6
Obsolete (compiler warning) in 4.6
Obsolete (compiler warning) in 4.5
Obsolete (compiler warning) in 4.5.1
Obsolete (compiler warning) in 4.5.2
Obsolete (compiler warning) in 4
Obsolete (compiler warning) in 3.5
Obsolete (compiler warning) in 3.5 SP1
Obsolete (compiler warning) in 3.0
Obsolete (compiler warning) in 3.0 SP1
Obsolete (compiler warning) in 3.0 SP2
Obsolete (compiler warning) in 2.0
Obsolete (compiler warning) in 2.0 SP1
Obsolete (compiler warning) in 2.0 SP2
如果我理解得没错,.NET 2.0已经过时了,已经有8-9年了(2006年推出)。为什么没有人修复这些问题?它们需要修复吗?当我研究GetHostByName方法时,我发现它已被GetHostEntry替代。很容易...但是等等,有很多人抱怨新函数的工作方式不同,也许你应该用GetHostAddresses替换它。好吧,麻烦。
考虑到我的解决方案中有超过28,000个文件,我不确定我是否可以随意搞事情。有没有一种方法可以知道过时函数的支持时间有多长?一旦我安装系统,应该期望这些工作吗?在代码调用过时接口(MSDN)的情况下,系统存在什么影响?
我并不想了解如何从自己的系统中删除过时代码,而是了解系统应该如何处理外部系统(例如MSDN)上的过时接口。他们显然没有遵循一个简单的循环,即标记过时、替换和删除旧接口。他们的政策是什么?使用MSDN定义接口的用户应该如何应对过时标记,特别是当过时代码没有用“苹果对苹果”等效函数替换时。