DotNET 1.1迁移至DotNET 2.0的注意事项

时间:2022-12-14 00:38:32
最近有一个项目要求从DotNET 1.1的平台下迁移到2.0下,花了一周时间进行这个工作,将迁移过程中碰到的一些问题记录下来,整理了这篇文章。
 
DotNET 2.0的类库较之DotNET 1.1发生了很大的变化,总体感觉在线程间调用,数据的检查方面比以前严格了。在迁移时需要注意如下问题。
 
1、控件AutoSize的变化
1.1、原先AutoSize是class Form的属性,现在提升到基类class Control中,所以原先继承class Control的自定义控件,如果自定义了AutoSize的属性需要修改名字或者重载。
1.2、class Form中新增加了AutoSizeMode的属性,用来替换原本AutoSize的行为。
 
2、Xslt的转换有比较大的变化,原XmlTransform类被废弃,新增XmlCompiledTransform类,其Transform方法的接口有所简化。但是使用上需要特别注意一点,如果作为转换脚本的Xslt文件中包含“ strip-space”属性,则需要使用Transform(XmlReader,XsltArgumentList,Stream)这一系列的重载方法,而不能使用Transform(IXPathNavigable,XsltArgumentList,Stream)这一系列的方法,否则在运行时会产生异常,转换失败。
 
3、组件签名的方式也发生了变化,原本利用“ [assembly: AssemblyKeyFile("..//..//mykey.snk")]”对组件进行签名,现在替换为在工程属性的签名标签中选择强名密钥文件。
 
4、在V1.1中是允许在子线程中,调用另一个UI线程(通常是主线程)中创建的UI控件的属性和方法。而在V2.0的平台下,同样的调用会引起NullReference的异常,必须把子线程的调用利用消息传送到被调用的UI线程中,在UI线程中调用本线程中创建的控件的实例才正确。
 
5、需要注意的是如果工程中使用到一些COM组件,那么在调试的时候必须选择“工程属性”->“调试”->“启动非托管代码调试”,否则在调试中会产生一些莫名的错误。
6、按照MSDN中的说法Monitor.Enter()/Exit(),将锁定引用类型的对象,而非值类型(Int32、Boolean)的对象。但是在V1.1的平台下,Monitor.Enter(Int32)/Monitor.Exit(Int32),没有起到实际同步的作用,但是不会产生错误。而在2.0的平台下,同样的方式将引发在“不同步的代码块中调用对象同步方法”的异常,所以需要用Lock(Object)或者Monitor.Enter(Object)/Monitor.Exit(Object)替换。
7、原DNS.GetHostName()方法已经废弃,被DNS.GetHostEntry()替换。
 
8、新增加了 SerialPort类,可以对串口进行操作,可以用此类来替换原本使用API的操作。
9、新增了 WebBrowse控件,可以用此控件替换原先使用IE提供COM控件。