vs2003和vs2005的编译区别(转) (2009-10-27 10:43:28)转载

vs2003按方案来编译文件,有一个文件 .csproj记录需要编译的文档的路径,.sln记录有哪些文件需要编译,如果修改某一个网页后需要重新编译生成,这时候需要把.sln中间设计到的所有文档同时拿到内存中来编译生成一个dll文档,如果User访问一个网页,会把DLL的整个内容放到内存中来供调用,占用内存,系统迟缓。 vs2005按档案位置来编译文件,它没有了记录文件位置的.csproj文件,只要是在该专案下面的文件他就可以拿来编译,目前我知道的有3种编译方式,1,同vs2003,生成一个大的dll档;2,在调试程序时可以设计成不生成dll的方式,即使修改了.cs的东西,可以不重新编译,通过浏览器就可以直接运行;3,可以设置在编译时一个cs文档就生成一个dll档,这样如果要用某一个网页,只把该网页的dll档调入内存就可以了

在VS2005 正确地创建、部署和维护由1.1迁移到ASP.NET 2.0 应用程序注意事项

没有项目文件。

ASP.NET 1.x 应用程序与 2.0 应用程序之间最明显的差别就是后者没有项目文件(例如 *.vbproj 或 *.csproj)。在 1.x 应用程序中,项目文件包含生成设置、对外部程序集的引用以及项目中的文件列表。而在 2.0 应用程序中,不再需要版本设置和文件列表,因为 Web 项目目录下的所有文件都被视为 Web 项目的一部分。



特殊目录。

ASP.NET 1.x 应用程序具有一个必需的目录 (/bin),用于包含程序集。ASP.NET 2.0 应用程序中则定义了一种更大的目录结构。新目录均以前缀“App_”开头,用于存储资源、程序集、源代码和其他组件。使用这种新的目录结构将不再需要项目文件,并且还可以选用某些新的部署方法。



代码分离模式。

在 ASP.NET 1.x 中,代码分离模式使内容(例如 foo.aspx)与代码(例如 foo.aspx.vb)分离。内容页面从代码分离页面继承而来,代码分离页面包含用户和设计器生成的代码。ASP.NET 2.0 通过使用局部类来增强代码分离模式,它允许一个类跨越多个文件。在新的代码分离模式中,内容页面从编译的类继承而来,它由相应的代码分离页面以及自动生成的存根文件组成,存根文件用于为内容页面中使用的控件定义字段声明。此项更改使自动生成的代码与用户的代码分离,并且使代码分离页面显著变小且更加简洁。局部类结构还降低了由于编辑设计器生成的代码而不小心破坏页面的风险。



编译模式(一个程序集对多个程序集)。

在 ASP.NET 1.x 中,所有的内容页面、代码分离页面和支持代码都预先编译到具有固定名称的单个程序集中。在 ASP.NET 2.0 中,则即时(默认)创建文件名各不相同的多个程序集。例如,每个 ASPX 页面(由内容页面、代码分离页面和隐藏的设计器页面组成)将被编译到各自的程序集中。App_Code 目录会自动把公共源代码编译到它自己的程序集中。这种新的编译模式使 ASP.NET 应用程序的结构发生了一些变化,但大大丰富了部署方式,以及在 Web 服务器上提供 Web 应用程序的方式。



部署方式(预编译、完整编译、可更新站点等)。

在 ASP.NET 1.x 中,Web 应用程序是作为一个大型程序集而预编译和部署的。内容页面(例如 *.aspx)不在服务器上编译,但可以在服务器上编辑。借助新的页面编译模式和目录结构,您就可以使用多种不同的配置来部署 ASP.NET 2.0 应用程序。在一种极端的情况下,您可以预编译所有的 ASPX 页面并部署由完全编译好的程序集组成的 Web 应用程序。在这种模式下,您不能在服务器上轻松地更改该应用程序。在另一种极端情况下,您可以在不预编译任何代码的情况下部署应用程序。在这种配置下,您可以直接在服务器上更改该应用程序中的 .aspx 页面、代码分离文件或其他任何代码。当用户请求服务器上的页面时,页面将被动态编译。

重大的改变

对代码分离文件的更改

在 ASP.NET 1.x 中,通常使用 .aspx 页面和代码分离文件将图形组件与编码组件分开。.aspx 页面是从代码分离文件派生而来的。这意味着您必须声明这两类的所有控件,以便正确绑定回调事件。这种继承关系还引发了有关使两类同步的某些问题,尤其是当开发人员对 .aspx 页面进行了更改(例如,添加一个控件)而没有对代码分离文件进行必要的更改也没有重新编译应用程序时。

在 ASP.NET 2.0 中,由于局部类这一概念的出现,代码分离模式已发生了变化。使用 partial 关键字可以将单个类的代码分隔到两个独立的文件中。代码分离文件定义了一个包含用户代码的局部类。设计器还将生成存根文件,其中包含一个局部类,用于定义 .aspx 页面中使用的控件对应的字段声明。编译后,.aspx 页面将从合并的局部类派生而来,并且被编译到它自己的页面程序集中。这种设计降低了由于编辑设计器生成的代码而不小心破坏页面的风险。

对应用程序的更改

转换向导将在下列几个方面对应用程序进行更新:

转换向导将在下列几个方面对应用程序进行更新:

将 .aspx 页面中的所有 CodeBehind 属性更改为 CodeFile 属性。

更改所有代码分离类定义以执行 partial 关键字。

如果在 .aspx 页面上声明了所有控件,则从代码分离文件中删除所有控件声明。

(仅限于 C#)将事件挂钩代码从代码分离文件的 InitialzeComponent 函数移到 .aspx 页面中。请注意,此操作不适用于自动调用的事件,包括 Page_Init、Page_Load、Page_DataBind、Page_PreRender、Page_Unload、Page_Error、Page_AbortTransaction 和 Page_CommitTransaction。



独立的代码文件

在 ASP.NET 1.x 中,所有源代码都编译到单个程序集中。此程序集存储在应用程序目录的 /bin 目录下。为了支持新的编译选项,并针对部署提供某些增强功能,ASP.NET 2.0 实际为每个 ASP.NET Web 页面和用户控件创建了单个程序集。此外,还创建了一个单独的程序集用来保存所有独立的代码文件(即,非代码分离的代码文件)。

对应用程序的更改

转换向导将在下列几个方面对应用程序进行更新:

转换向导将在下列几个方面对应用程序进行更新:

将所有独立的代码移到 App_Code 目录下。

将所有的默认、Friend 和 Internal 范围的声明更改为 Public。需要进行此项更改是因为代码分离文件不再与共享代码位于同一个程序集中。因此,必须更改访问级别以便与新的多程序集结构相匹配。

将所有 Type.GetType() 调用更改为 System.Web.Compilation.BuildManager.GetType()。这种新方法可自动识别要访问哪个程序集来查找类的类型。如果您试图在代码分离文件中使用 Type.GetType(),将很可能遇到 TypeLoadException,因为代码分离文件与独立的代码位于不同的程序集中。



资源

由于 ASP.NET 2.0 中的新目录结构,资源文件的位置和存储已发生了变化。尤其是,ASP.NET 2.0 应用程序现在具有一个 App_GlobalResources 目录,专门用于保存资源文件。转换向导将自动把必需的资源文件重新定位到相应的位置。在 ASP.NET 2.0 中,不再需要与 Web 窗体相关联的资源文件,因此将不对其进行修改。

由于 ASP.NET 2.0 中的新目录结构,资源文件的位置和存储已发生了变化。尤其是,ASP.NET 2.0 应用程序现在具有一个 App_GlobalResources 目录,专门用于保存资源文件。转换向导将自动把必需的资源文件重新定位到相应的位置。在 ASP.NET 2.0 中,不再需要与 Web 窗体相关联的资源文件,因此将不对其进行修改。

对应用程序的更改

转换向导通过将所有独立的资源文件移到 App_GlobalResources 目录下,对应用程序进行更新。此目录下的所有文件将内置在单个程序集中。

转换向导通过将所有独立的资源文件移到 App_GlobalResources 目录下,对应用程序进行更新。此目录下的所有文件将内置在单个程序集中。

请注意,必须进行某些其他的代码更改,以便访问资源文件。这些代码更改在“常见转换问题”部分的“资源文件”中进行了概要介绍。

引用

在 ASP.NET 1.x 中,有三种类型的外部程序集引用方式:

在 ASP.NET 1.x 中,有三种类型的外部程序集引用方式:

全局程序集缓存 (GAC):Web 应用程序依赖于位于系统的 GAC 中的某个程序集。以这种方式引用的程序集存储在项目文件中,编译器在运行时会将 Web 应用程序链接到 GAC 中的该程序集。

项目对项目 (P2P):在转换过程中,如果解决方案中的所有项目同时转换,将保持 P2P 引用方式。

本地:Web 应用程序依赖于在 Web 项目的解决方案外创建的某个基于文件的程序集。以这种方式引用的程序集存储在项目文件中,Visual Studio 将把该程序集的一个版本复制到 bin 目录下。如果 CopyLocal 设置为 true,则将用该程序集的最新版本来更新 bin 目录。编译器会将 Web 应用程序链接到 bin 目录下的该程序集。



ASP.NET 2.0 使用 bin 目录存储以 P2P 和本地方式引用的程序集。此目录不仅包含针对应用程序自动生成的程序集,还可以存储应用程序需要引用的任何其他可执行代码。

对应用程序的更改

由于 ASP.NET 2.0 应用程序没有项目文件,因此必须移动对外部程序集的引用。

GAC 引用被移到 web.config 文件中。例如:

<system.web>

<compilation>

<assemblies>

<add assembly="EnvDTE, Version=8.0.0.0, Culture=neutral,

PublicKeyToken=B03F5F7F11D50A3A"/>

</assemblies>

</assemblies>

... Other tags

</compilation>

... Other tags

</system.web>

对 GAC 中的程序集的 web.config 引用

P2P 引用存储在解决方案文件中。在转换过程中,如果解决方案中的所有项目同时转换,则 P2P 引用将保持为 P2P。

在 Visual Studio 2005 的 Beta 2 版中,本地引用的程序集不可更新。在 Visual Studio 2005 的最终版本中,通过添加 Refresh 文件修复了此行为。此文件存储在 bin 目录下,其文件名采用程序集名称加上“.refresh”的方式来生成。Refresh 文件包含指向外部引用的程序集的路径,其存在向编译器指明,如果原始程序集的时间戳时间较晚,则需要刷新此程序集及其依赖的程序集。这与 Visual Studio .NET 2003 中的“复制本地”行为相似。



以 P2P 和本地方式引用的程序集都被复制到 Bin 目录下。

Web 引用

与常规引用不同,Web 引用指向 Web 服务。在 Visual Studio .NET 2003 中,当您在 ASP.NET 1.x 应用程序中创建了 Web 引用后:

1.

就在该应用程序的 Web References 目录下创建了一个目录

2.

就创建了一个引用类,其中包含 Web 服务的 WSDL 中为每个对象定义的代理类。

3.

就创建了一个名为 reference.map 的 discovery 文件,其中包含有关如何创建和更新 Web 引用的信息。



ASP.NET 2.0 更改了此过程以构成新的目录结构以及 Web 服务在 .NET Framework 2.0 中的处理方式的一些更改。

对应用程序的更改

转换向导将在下列几个方面对应用程序进行更新:

将所有 Web 引用目录从 Web References 目录移到 App_WebReferences 目录下。

在 App_Code 目录下放置 WSDL 文件的一个副本。WSDL 文件的版本提供程序将自动生成 Web 服务代理类,这些代理类已编译,并且可通过任何 Web 页面访问,因为它们存储在 App_Code 目录下。

删除由 Visual Studio .NET 2003 生成的代理类。旧的 1.x 代理类不再是必需的,因为这些代理现在可在 App_Code 目录下自动生成。

将 discovery 文件的扩展名 .map 更改为 .discomap。



Web 服务

在 ASP.NET 1.x 中,Web 服务 (.asmx) 自动拆分到空白标题页面 (.asmx) 和包含实际方法的代码分离文件中。

对应用程序的更改

转换向导将在下列几个方面对应用程序进行更新:

将代码分离类移到 App_Code 目录下,以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。

更改 .asmx 文件中的 CodeBehind 属性,以便指向新位置。(请注意,代码分离文件不使用局部类,因此继续使用 CodeBehind 属性。)

将所有的默认、Friend 和 Internal 范围的声明更改为 Public。



Global.Asax

在任一 ASP.NET 应用程序中,您都可以使用 Global.asax 文件捕获特定的应用程序级事件,包括启动、关闭、会话周期、请求周期和错误消息。此文件与 Web 服务文件十分相似,它具有简单的 shell 标题页面 (.asax) 和代码分离文件。

对应用程序的更改

转换向导将在下列几个方面对应用程序进行更新:

转换向导将在下列几个方面对应用程序进行更新:

将代码分离文件移到 App_Code 目录下,以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。

“Code-behind”属性将从 ASAX 文件的指令中删除。

(对于 Visual Basic)向该类文件中添加一条命名空间语句。命名空间由 Web 项目中的根命名空间定义。



数据集

在 ASP.NET 1.x 中,使用内置的向导或 xsd.exe 命令行工具来生成类型化 DataSet 对象。生成的代理对象存储在顶层目录下。而在 ASP.NET 2.0 中,这些 DataSet 对象以不同的方式生成和存储。

对应用程序的更改

转换向导将在下列几个方面对应用程序进行更改:

将 .xsd 文件(DataSet 描述符)移到 App_Code 目录下。运行时将自动根据此文件生成类型化数据集。

删除旧的代理文件。



C#2.0语法上的变化:
①泛型:
为什么要引入泛型?
举个例子比较好理解:例如定义一个System.Collection.ArrayList,里面的元素是object类型的,当从中取出的时候需要作强制类型转换ClassA tmp = myArrayList[0] as ClassA;这有两方面问题,一是强制类型转换的性能开销,二是类型安全(编译通过但是运行有可能出错)。在.net1.0中类似的情况是比较多的,引入泛型是为了较好地解决此问题。
所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
还是看看代码吧:
class Stack<T>
{
private T[] store;
private int size;
public Stack()//构造函数
{
store = new T[10]; size=0;
}
public void Push(T tmp)
{
store[size++] = tmp;
}
public T Pop
{
return store[--size];
}
}
上面就是一个泛型的实现,在实例化的时候该类的时候我们可以这样声名
Stack<int> aaa = new Stack<int>();
那么就约束了只能往这个堆栈里放int类型,例如aaa.Push(17);是可以的;
但是aaa.Push("123");编译就会不通过。
class C<U,V> {}
class D: C<string,int> {}
class E<U,V>: C<U, V> {}
class F<U,V>: C<string, int> {}
上面这些都是一些泛型的实现,这里就不一一解释了~
泛型还可以应用于接口和委托,实际编程时还有一些实际问题。
值得一提的是下面这个例子:(where)
class MyClass<S,T>
where S: A // S继承自A
where T: B // T继承自B
{......}
②匿名方法与迭代器;

匿名方法其实没什么,对比一下下面这两段代码就明白了:
(C# 1.0):
Button1.click += new EventHandler(Button1_Click);
private void Button1_Click(object sender,EventArgs e)
{
TextBox1.Text = "123";
}
有了匿名方法之后(C# 2.0):
Button1.Click += delegate {
TextBox1.Text = "123";
}
关于匿名方法,老实说,偶认为只是为了可以省掉几行代码,比较方便地处理委托,属于C#编译器的“小花招”而已......

然后是“迭代器”:
在没有这个东东的时候如果需要创建一个集合(可用于foreach循环),需要如此实现
Public class MyCollection : Ienumerable {
public MYEnumerator GetEnumerator(){
return new MyEnumerator(this);
}
public class MyEnumerator : Ienumerator{
public void Reset(){ … }
public bool MoveNext(){ … }
public int Current{ … }
object IEnumerator.Current{ get{ … } }
}
}
有了“迭代器”之后,这样就可以:
public class Stack<T>: IEnumerable<T>
{
T[] items;
int count;
public void Push(T data) {…}
public T Pop(){…}
public Ienumerator<T> GetEnumerator(){
for (int I = count – 1; i >=0;--i){
yield return items[i];
}
}
比较简单,看看就能明白,有两个地方稍有点新鲜的:
1)增加了yield关键字;
2)使用迭代器创建倒序遍历:
Public Ienumerable<T> Bottom ToTop{
get {
for(int I = 0;i < count; i++>){
yield return items[i];
}
}}
③分部类型定义:
分部类型允许我们将一个类、结构或者接口分成几个部分,分别实现在几个不用的.cs文件中。当然,各个部分的命名空间是要相同的,访问保护修饰符也不能互相冲突。
为了实现这个东西,引入了半个关键字partial,之所以叫半个,是因为只有和class、struct、interface放在一起时,才有关键字的含义。
分部类型的实用意义偶倒是想到一个,就是我们有一些代码文件是通过某些工具生成的(例如用一些映射工具或者自己写的代码生成工作,去生成一些基本的实体类、数据访问类等),这些代码文件我们又不希望跟手工增加的代码放在一起,就可以分开n个部分来放。
最后来段简单代码作为例子:
partial class MyClass
{
public void test1()
{....}
}
partial class MyClass
{
public void test2()
{....}
}
代码可以这样写,最终编译器还是会把各个部分编译到一起的,没有实质区别。
④Nullable 泛型结构:
Nullable 泛型结构允许一个值类型具有“空值”意义,从而方便很多场合的运算,如数据库中的空字段。
int? a= null;
if(a == null)
{
// a如果为空,则....;
}
else
{
// a如果不为空,则....;
}

空属类型实际上是一个泛型类型System.Nullable<T> 。

⑤静态类:
问题真是一个比一个简单,静态类就是一个只包含静态成员的类。
例子
static class MyStaticClass
{
public const int aaa;
public static void Test1()
{
//……
}
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值