关于c#:从.NET 1.1升级到.NET 2.0,会有什么期望?

关于c#:从.NET 1.1升级到.NET 2.0,会有什么期望?

Upgrading from .NET 1.1 to .NET 2.0, what to expect?

我正在开发一个大型的.NET 1.1项目,并且希望对此进行升级,主要是为了能够使用更好的工具(例如Visual Studio 2008),而且由于.NET中的新功能和少量错误 2.0框架。

该项目包含VB.NET的较大部分,但C#中也有部分。 它是一个Windows Forms应用程序,使用了各种第三方控件。 使用.NET远程富客户端与与MSSQL 2000数据库接口的服务器进程进行通信。

如果我们决定执行升级,我们可以期待什么样的问题?


.Net 2.0及更高版本中的theading模型有所变化,其中线程中未处理的异常将导致整个应用终止。更新一个执行了很多线程并偶尔崩溃的应用程序时,我遇到了这个问题。显然,.Net 2.0模型更强大,因为无论如何您肯定都应该抓住这些问题,但这是我进行迁移时遇到的唯一真正的问题。

本文讨论了所有内容:
http://odetocode.com/blogs/scott/archive/2005/12/14/2618.aspx


我们正在考虑现在Tobi进行相同的迁移。首先,通过复制项目(或项目的一部分)并通过.NET 2.0编译器对其进行"空运行",您可以很好地了解预期的结果。我的经验是,2.0编译器会给出有关1.1编译器会下滑的不良编程习惯的更多警告。编译器将警告您有关隐式强制转换,"歧义"返回路径(函数不返回值的代码路径)以及其他一些小事情。

以下一些链接可能会有所帮助:
.NET Framework兼容性

.NET Framework 2.0中重大更改的Word文档


除了上面提到的应用程序配置之外,如果您使用任何XSD验证,则还需要替换一些有关加载和验证XML的代码。


看一下有关将.NET 2.0应用程序升级到3.5的白皮书。我认为从1.1到2.0的更改更为重要,但是过程应该相似。


真的没什么。您会在编译中发现一些有关过时方法的警告,但这些警告通常很难解决。

您应该拍大片并继续拍摄3.5。这里的水很好。


RESX文件升级问题

当心国际化的RESX文件。

当您在.net 2.0中重新打开.net 1.1表单时,RESX文件将升级到新版本。在.net 1.1中,外语.resx文件仅包含更改。在.net 2.0中,默认.resx文件中的所有字段现在都移到了外语resx文件中。 (例如.fr.resx)。如果您已经国际化,则必须查看所有外语resx文件。

国际化工具

您可能曾经使用过的或自己编写的用于进行国际化的某些工具可能不再起作用,因为它们可能已经使用了编号的资源。 (多语言和基础知识)

Infragistics Winforms控件修改.net 1.1中的InitializeForm()并使用资源编号系统访问资源。迁移到.net 2.0时,随着重新生成resx文件,Infragistics资源的编号将失败。您将需要升级Infragistics库。


我们处理电子邮件的方式必须改变。 1.1版使用了system.WEB.mail,带有

1
2
3
4
5
6
7
8
9
10
11
12
13
    Imports System.Web.Mail
    '
    Dim message As New MailMessage'
this is a web.mail msg, not a net.mail msg
    Dim objConn As SmtpMail
    Dim objAttach As MailAttachment
        '
    message .From ="From@us.com"
       '
more properties assigned to objMail
    objAttach = New MailAttachment(ExportName)
    message.Attachments.Add(objAttach)
       ' Here's where we actually send the thing
    SmtpMail.SmtpServer.Insert(0,"127.0.0.1")
    objConn.Send(objMail)

新的有system.NET.mail

1
2
3
4
5
6
7
8
9
10
11
12
         Imports System.Net.Mail
        '
         Dim message as MailMessage '
this is a net.mail msg, not a web.mail msg
         Dim data As Attachment
        Dim client As New SmtpClient("127.0.0.1")
    '
        data = New Attachment(ExportName)
    '
Create the message and add the attachment
        message = New MailMessage(EmailFrom, EmailTo, reportDescription)
        message.Attachments.Add(data)
' Send the message
        client.Send(message)


事情可能会编译正常,但是今年初我们升级的应用程序遇到了一些讨厌的运行时问题。

首先,当从2.0应用程序调用1.1 Web服务时,DateTime对象中的时区处理存在很多问题,因为在序列化到线路上时往返于UTC的转换在框架版本之间的工作方式似乎有所不同。

另外,2.0异步Web服务使用基于klutzy事件的机制而不是IAsyncResult模式,如果要批量处理请求,这将是一大麻烦。

最后,我们有一些旧代码,使用Microsoft.mshtml.dll托管了嵌入式浏览器。升级到2.0会使应用程序无提示地切换到该dll的较新版本,该dll的某些行为与javascript交互有关。最后一个情况有些晦涩,但表明迁移到较新的运行时可能会对您可能进行的任何COM交互产生影响。

希望这可以帮助!


.NET 1.1和.NET 2.0-3.5是完全不同的框架,更重要的是,.NET 3.5只是可以添加到.NET 2.0项目中的一组额外程序集-到目前为止,实际上没有更改任何核心程序集我知道-以及一个升级的编译器,它知道称为LINQ的语法糖,扩展方法等。

换句话说,我认为.NET 2.0-3.5升级与.NET 1.1-2.0升级非常相似。


除了一些关于过时的警告之外,大多数代码仍应编译。

但是,关于Visual Studio生成的代码,您需要注意几件事。

如果您已经在Visual Studio 2003中生成了强类型的数据集,则可以忘记在新版本的Visual Studio中进行编辑。您必须重建它们或更好地将它们替换为nHibernate之类的东西,以获得最终的OR-mapper-bliss

表单的设计者仍应使用旧表单。您可能会感到困惑,因为2005和2008在这里使用了部分类。因此,如果您创建新表单,则代码看起来与旧表单不同。
我从未升级过ASP.Net应用程序,所以我不了解Web表单,但我想它的作用与Winforms相同。通常它会起作用,但是会引起一些设计师的怪异。


您将看到最多的编译警告是,如果您使用app.config存储程序设置。 System.Configuration.ConfigurationManager弃用了1.1配置类。

您可能会看到来自编译器的其他警告将针对未初始化的变量(在变量声明中将其设置为" = none"或" = null;",以使其消失)和未使用的变量(编译器确保它们已被删除)。安全删除)。


应该没有太大的问题,因为从理论上讲它是向后兼容的(我注意到MikeeMike对线程异常的评论)。移动之后,您会发现很多不错的东西,例如泛型。尽管您不想一口气将所有集合移植到泛型,但是一旦完成此操作,由于转换次数减少,代码应该更加可靠-并且可能更快(尽管里程在这方面可能有所不同) 。目前,我将开始对三个产品进行.NET 2-> .NET 4转换。主要优势将是对多线程支持(并行foreach循环等)的进一步改进。


尽管您可能会收到一些过时的方法警告,但您可能不会遇到任何重大问题。编译器通常应该告诉您什么是替代品。我知道某些System.Configuration事物已更新。


推荐阅读