我正在开发一个大型.NET 1.1项目,并且希望升级它,主要是为了能够使用更好的工具,如Visual Studio 2008,但也因为新功能和少量的错误.NET 2.0框架。
该项目包含VB.NET的大部分内容,但C#中也有部分内容。它是一个Windows窗体应用程序,使用各种第三方控件。使用.NET远程处理,富客户端与服务器进程通信,该进程与MSSQL 2000数据库连接。
如果我们决定进行升级,我们可以期待哪些问题?
答案 0 :(得分:8)
.Net 2.0以后的主题模型发生了变化,线程中未处理的异常将导致整个应用程序终止。我在更新一个执行大量线程并偶尔崩溃的应用程序时遇到了这个问题。显然.Net 2.0模型更强大,因为你无论如何都应该抓住它们,但这是我在进行迁移时遇到的唯一真正的问题。
本文将讨论所有相关内容: http://odetocode.com/blogs/scott/archive/2005/12/14/2618.aspx
答案 1 :(得分:5)
我们现在正在考虑做同样的迁移Tobi。首先,您可以通过制作项目(或其中的一部分)并通过.NET 2.0编译器进行“干运行”来了解期望的内容。我的经验是,2.0编译器提供了关于1.1编译器允许滑动的错误编程实践的更多警告。编译器会警告你有关隐式转换,“模糊”返回路径(函数不返回值的代码路径)以及其他一些小问题。
以下是一些您可能会发现有用的链接: .NET Framework Compatability
答案 2 :(得分:2)
没什么,真的。你会发现有关过时方法编译的几个警告,但通常这些都很容易修复。
你应该大拍,然后去3.5。这里的水是niiiiiiice。
答案 3 :(得分:2)
看一下这个whitepaper,将.NET 2.0应用程序发展到3.5。我认为从1.1到2.0的变化更为重要,但过程应该类似。
答案 4 :(得分:2)
除了上面提到的app配置之外,如果你使用任何XSD验证,你需要在加载和验证XML时替换一些代码。
答案 5 :(得分:1)
如果使用app.config存储程序设置,您将看到的大多数编译警告。 System.Configuration.ConfigurationManager已弃用1.1配置类。
您可能会看到来自编译器的其他警告将用于未初始化的变量(在变量声明中将它们设置为“= nothing”或“= null;”以使它们消失)和未使用的变量(编译器确定他们可以安全删除。)
答案 6 :(得分:1)
除了一些关于过时的东西的警告之外,大多数代码仍然应该编译。
但是,对于Visual Studio生成的代码,您应该注意一些事项。
如果您在Visual Studio 2003中生成了强类型数据集,则可以忘记在较新版本的Visual Studio中编辑它们。你必须重建它们或者更好地用nHibernate替换它们以获得最终的OR-mapper-bliss
表单的设计者仍应使用旧表单。你可能会感到困惑,因为2005年和2008年在这里使用了部分类。因此,如果您创建新表单,代码看起来与旧表单不同。 我从来没有升级过ASP.Net应用程序所以我不知道网页表单,但我想它会像winforms一样工作。大多数情况下它会起作用,但期望一些设计师的怪异。
答案 7 :(得分:1)
.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升级非常相似。
答案 8 :(得分:1)
事情可能会编译好,但是我们在今年年初升级的应用程序中遇到了一些令人讨厌的运行时问题。
首先,当从2.0应用程序调用1.1 webservices时,我们在DateTime对象中遇到了许多时区处理问题,因为在序列化到线路时往返于UTC的转换似乎在框架版本之间有所不同。
此外,2.0异步Web服务使用基于klutzy事件的机制而不是IAsyncResult模式,如果您正在批量处理请求,这将是一种巨大的痛苦。
最后,我们有一些使用Microsoft.mshtml.dll托管嵌入式浏览器的遗留代码。升级到2.0会导致应用程序以静默方式切换到该dll的较新版本,该版本具有与javascript交互相关的一些更改行为。最后一个是一个不起眼的案例,但表明迁移到较新的运行时可能会影响您可能拥有的任何COM交互。
希望这有帮助!
答案 9 :(得分:1)
我们做电子邮件的方式必须改变。 1.1版本使用了system.WEB.mail,带有
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
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)
答案 10 :(得分:1)
注意国际化的RESX文件。
当您在.net 2.0中重新打开net 1.1表单时,RESX文件将升级到新版本。在.net 1.1中,外语.resx文件仅包含更改。在.net 2.0中,默认.resx文件中的所有字段现在都被移动到外语resx文件中。 (例如.fr.resx)。如果您已经将表格国际化,则必须查看所有外语resx文件。
您可能已经使用/自己编写的一些工具可能不再起作用,因为它们可能使用了编号资源。 (Multi Lang& Infragistics)
Infragistics Winforms控件修改.net 1.1中的InitializeForm()并使用资源编号系统访问资源。迁移到.net 2.0时,Infragistics资源的编号将在重新生成resx文件时失败。您需要升级Infragistics库。
答案 11 :(得分:0)
您可能不会遇到任何破解问题,但您可能会收到一些弃用的方法警告。编译器通常应该告诉您更换的内容。我知道一些System.Configuration事情已经更新。
答案 12 :(得分:0)
理论上应该没有太多的问题,因为它是向后兼容的(我注意到MikeeMike关于线程异常的评论)。移动之后,你会很好,有很多好东西,如泛型。虽然您不希望一下子将所有集合移植到泛型,但是一旦完成此操作,您的代码应该更加可靠,因为演员阵容数量减少 - 并且可能更快(尽管里程可能会有所不同) 。目前我即将启动.NET 2 - > .NET 4转换我的三个产品。主要优点是多线程支持(并行foreach循环等)的进一步改进。