.NET是MicrosoftXMLWebservices平台。XMLWebservices允许应用程序通过Internet进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft.NET平台提供创建XMLWebservices并将这些服务集成在一起之所需。
2014年4月4日,微软成立.NET基金会去管理和引导开源组件的开发;2014年11月13日,微软宣布将免费提供VisualStudioCommunity2013。
刀奈特
.NET
Windows系统、Linux、MacOSX、iOS和Android
MicrosoftXMLWebservices平台
微软
比尔盖茨
2000年11月
Microsoft
.net
从技术的角度,一个.NET应用是一个运行于.NETFramework之上的应用程序。(更精确的说,一个.NET应用是一个使用.NETFramework类库来编写,并运行于公共语言运行时CommonLanguageRuntime之上的应用程序。)如果一个应用程序跟.NETFramework无关,它就不能叫做.NET程序。比如,仅仅使用了XML并不就是.NET应用,仅仅使用SOAPSDK调用一个WebService也不是.NET应用。.NET是基于Windows操作系统运行的操作平台,应用于互联网的分布式。
2014年11月13日,为了进一步扩大云计算市场,微软将不再把.NET和VisualStudio等关键软件技术局限在Windows平台,今后还将兼容Linux、MacOSX、iOS和Android。除此之外,微软还宣布将开放.NET核心服务器运行环境和框架的源代码,使得外部开发者也可以对这一软件开发平台做出贡献。
WebServices是智能终端软件的基础,微软为用户创建智能终端提供了一整套丰富的解决方案,包括:
.NETFramework-智能终端实现跨平台(设备无关性)的
VisualStudio.NET–建立并集成WebServices和应用程序的快速开发工具
MicrosoftWindowsServer2003–新一代的企业服务器,用于提供建立和发布各种解决方案
在这里指出Webservices不是微软发明的,同样也不属于微软专有。Webservices是一个开放的标准,和HTTP、XML、SOAP一样。他们是一个工业标准而非微软标准,WS-I是为了促进WebServices互通性的联盟组织,最初是由IBM和微软所发起,其它的成员包括BEASystem、惠普计算机(HP)、甲骨文(Oracle)、英特尔(Intel)和SUN计算机(SunMicrosystem)。如今网络上存在的大多Webservices其实没有使用.NET构架,Webservices具有互操作属性,你同样可以使用Windows开发客户端来调用运行于Linux上面的Webservices的方法。
MicrosoftWindowsServerSystem包括:
MicrosoftApplicationCenter2000-配置和管理Web应用程序
MicrosoftBizTalkServer2002-建立基于XML的跨应用和组织的商业逻辑
visualstudio.net
MicrosoftCommerceServer2002–能够迅速建立大规模电子商务的解决方案
MicrosoftContentManagementServer2002–管理动态电子商务网站的目录
MicrosoftExchangeServer2000–用于进行随时随地的通讯协作
MicrosoftHostIntegrationServer2000–用于和主机系统之间传输数据
MicrosoftInternetSecurityandAccelerationServer2000(ISAServer)–internet连接
MicrosoftMobileInformationServer2002–用于支持手持设备
MicrosoftOperationsManager2000–描述企业级解决方案的操作管理
MicrosoftProjectServer2002-提供项目管理的最佳方案
MicrosoftSharePointPortalServer2001–查询、共享、发布商业信息
MicrosoftSQLServer2000–企业级数据库
MicrosoftVisualStudio.NET和Microsoft.NETFramework对于建立,发布并运行WebServices是一个完美的解决方案。
.NET的
NETFramework环境
初级组成是CIL和CLR。CIL是一套运作环境说明,包括一般系统、基础类库和与机器无关的中间代码,全称为通用中间语言(CIL)。CLR则是确认操作密码符合CIL的平台。在CIL执行前,CLR必须将指令及时编译转换成原始机械码。
所有CIL(通用中间语言)都可经由.NET自我表述。CLR检查元资料以确保正确的方法被调用。元资料通常是由语言编译器生成的,但开发人员也可以通过使用客户属性创建他们自己的元资料。
如果一种语言实现生成了CIL,它也可以通过使用CLR被调用,这样它就可以与任何其他.NET语言生成的资料相交互。CLR也被设计为作业系统无关性。
当一个汇编体被载入时,CLR执行各种各样的测试。其中的两个测试是确认与核查。在确认的时候,CLR检查汇编体是否包含有效的元资料和CIL,并且检查内部表的正确性。核查则不那么精确。核查机制检查代码是否会执行一些“不安全”的操作。核查所使用的演算法非常保守,导致有时一些“安全”的代码也通不过核查。不安全的代码只有在汇编体拥有“跳过核查”许可的情况下才会被执行,通常这意味着代码是安装在本机上的。
通过.NET,你可以用SOAP和不同的Webservices进行交互。
每个新版本的.NETFramework都会保留早期版本中的功能并会添加新功能。CLR由其自己的版本号确定的。某些版本的.NETFramework包含新版本的CLR,而其他版本的.NETFramework使用早期版本的CLR。例如,.NETFramework4包含CLR4,而.NETFramework3.5包含CLR2.0。(没有版本3的CLR。)虽然.NETFramework4.5是.NETFramework4的就地更新,基础CLR版本号成为CLR4.5。
通常,您不应卸载计算机上安装.NETFramework的任何版本,因为您使用的应用程序可能取决于特定版本,并且可能中断,如果移除该版本。您可以同时在一台计算机上加载.NETFramework的多个版本。这意味着可以安装.NETFramework,而无需卸载旧版本。
完整版号-2.0.50727.42,发布于2005年10月27日。
.NET框架2.0的组件都包含在VisualStudio2005和SQLServer2005里面。通过MSDNUniverse版可以免费下载RTM版本。
自1.1版本以来的改进:
大量的API变更。
新的API让需要管理.NET运行库实例的非.NET的应用程序可以做到这点。这个新的API对.NET运行库的各种功能,包括:多线程、存储器分配、代码加载等,提供了很好的控制。它最初是为MicrosoftSQLServer能够有效率的使用.NET运行库而设计的,因为MicrosoftSQLServer拥有它自己的日程管理器和存储器管理器。
.NET框架4.5是.NET框架4高兼容性的就地更新(in-placeupdate)。搭配C#或VisualBasic程序设计语言使用.NET框架4.5,即可编写WindowsStore风格的应用程序。.NET框架4.5可提升性能、可靠度及安全性。于2012年8月15日推出。但请注意,.NET框架4.5不支持WindowsXP操作系统。
.NETFramework4.0,英文版于2010年4月12日推出。
主要的新特性有以下几个方面:
动态编程
并行计算
后期绑定
协变与逆变
接下来我们一一领略C#4.0中的语言特性。
C#是静态强类型语言。而在很多情况下,提供“动态”行为,是常常发生的事情,例如通过反射在运行时访问.NET类型、调用动态语言对象、访问COM对象等,都无法以静态类型来获取。因此,C#4.0引入的又一个全新的关键字dynamic,也同时引入了改善静态类型与动态对象的交互能力,这就是动态查找(DynamicLookup)例如:
dynamicd=GetDynamicObject();
d.MyMethod(22);//方法调用
d.A=d.B;//属性赋值
d[“one”]=d[“two”];//索引器赋值
inti=d+100;//运算符调用
strings=d(1,2);//委托调用
就像一个object可以代表任何类型,dynamic使得类型决断在运行时进行,方法调用、属性访问、委托调用都可动态分派。同时,动态特性还体现在构建一个动态对象,在C#4.0实现IDynamicObject接口的类型,可以完全定义动态操作的意义,通过将C#编译器作为运行时组件来完成由静态编译器延迟的操作,例如:
dynamicd=newFoo();
strings;
d.MyMethod(s,3,null);
在具体执行过程中,C#的运行时绑定器基于运行时信息,通过反射获取d的实际类型Foo,然后在Foo类型上就MyMethod方法进行方法查找和重载解析,并执行调用,这正是动态调用的背后秘密:DLR。在.NET4.0中将引入重要的底层组件DLR(DynamicLanguageRuntime,动态语言运行时),除了实现动态查找的基础支持,DLR也同时作为基础设施为类似于IronRuby、IronPython这样的动态语言提供统一的互操作机制。总而言之,动态编程将为C#在以下领域产生巨大的变革:
·Office编程与其他COM交互。
·动态语言支持,在C#中消费IronRuby动态语言类型将并非难事,体验动态语言特性指日可待。
·增强反射支持。
以调用IronRython为例,我们只需引入IronPython.dll,IronPython.Modules.dll,andMicrosoft.Scripting.dll,即可通过创建ScriptRuntime在C#中HostingIronPython环境,进而来操作动态语言的类型信息。
ScriptRuntimepy=Python.CreateRuntime();
dynamicmypy=py.UseFile("myfile.py");
Console.WriteLine(mypy.MyMethod("Hello"));
虽然从微软当前提供的技术资料和CTP演示中,动态查找还存在或多或少的问题,但是在“动态”大行其道的今天,我们无法回避也必须拥抱这个未来的主角,因为我坚信明天会更好。
并行计算的出现,是计算机科学发展的必然结果,随着计算机硬件的迅猛发展,在多核处理器上工作已经是既存事实,而传统的编程模式必须兼容新的硬件环境才能使计算机性能达到合理的应用效果。用Anders大师的话说:未来5到10年,并行计算将成为主流编程语言不可忽视的方向,而4.0为C#打响了实现并发的第一枪。
未来的.NETFramework4.0中将集成TPL(TaskParallelLibrary)和PLINQ(ParallelLINQ),这也意味着未来我们可以应用C#4.0实现并行化应用,在统一的工作调度程序下进行硬件的并行协调,这将大大提高应用程序的性能同时降低现存并发模型的复杂性。
那么,我们应该一睹为快应用C#武器来开发并发环境下的超酷感受,在System.Threading.Parallel静态类提供了三个重要的方法For、Foreach、Invoke可以为我们小试牛刀:
//应用TPL,执行并行循环任务
int[]selected=(fromxindata.AsParallel()
selectx+1).ToArray();
更详细的对比示例留待读者在实践中对此进行讨论,并行计算为托管代码在多核环境下的性能优化提供了统一的解决方案,而未来我们会做的更好。
备注:实际上,我们可以选择下载安装MicrosoftParallelExtensionstothe.NETFramework3.5June2008CTP包,就可以在.NET3.5环境下体验并行计算的无穷魅力。
协变和逆变,是为解决问题而生的。而要理清解决什么样的问题,需要首先从理清几个简单的概念开始。首先我们进行一点操作:
Derivedd=newDerived();
Baseb=d;
Derived类型继承自Based类型,由Derived引用可以安全的转换为Based引用,而这种转换能力可以无缝的实现在Derived数组和Base数组,例如:
Derived[]ds=newDerived;
Base[]bs=ds;
而这种原始转换(由子类转换为父类)方向相同的可变性,被称为协变(covariant);其反向操作则被称为逆变(contravariant)。当同样的情形应用于泛型时,例如:
Listds=newList();
Listbs=ds;
类似的操作却是行不通的。所以,这就成为C#4.0中完善的问题——泛型的协变与逆变:
Listbs=newList();Listds=newList();
bs=ds;//List;支持对T协变
ds=bs;//List;支持对T逆变
而在C#4.0中,伴随着协变与逆变特性的加入,C#引入两个in和out关键字来解决问题。
TMyAction();
publicinterfaceIContravariant
voidMyAction(Targ);
其中,out表示仅能作为返回值的类型参数,而in表示仅能作为参数的类型参数,不过一个接口可以既有out又有in,因此既可以支持协变、支持逆变,也可以同时支持,例如:
publicinterfaceIBoth
MyMethod(20,z:200);
相当于调用MyMethod(20,10,200),非常类似于Attribute的调用方式。虽然只是小技巧,但也同时改善了方法重载的灵活性和适配性,体现了C#语言日趋完美的发展轨迹。
当然,除此之外.NET4.0还增加了很多值得期待的平台特性,也将为C#编码带来前所未有的新体验。
.NETFramework3.0(曾用名WinFX)是微软为操作系统WindowsVista(旧称“Longhorn”)而特别设计的API。.NETFramework是对.NET架构和Win32API的扩展。虽然Win32API仍然存在于WindowsVista中,但是在WinFX中不能通过它直接调用。另外,WinFX将提供给.NET程序员更加简便地方式来调用Windows中的功能。
.NETFramework3.0同样能在WindowsXP和WindowsServer2003的计算机上运行,这样增加了能够运行.NETFramework3.0程序的计算机数量。由于向后兼容,能够更加容易将这些技术介绍给开发人员和最终用户。2006年9月1日,微软发布了.NETFramework3.0的RC版本,开发人员能够无需安装Vista就可以体验这些新的技术。
.NETFramework3.0并没有新版本的CLR,而是在.NETFramework2.0的基础上增加了几个新的部件,所以并没有任何程序设计语言有新的语法特性,如果要安装.NETFramework3.0,则必须先安装.NETFramework2.0,.NETFramework3.0可以完全向下兼容.NETFramework2.0。
.NETFramework3.0主要由的四部分组成:
WPF(WindowsPresentationFoundation),内部代码“Avalon”,是一套基于XAML(eXtensibleApplicationMarkupLanguage)、.NET和矢量图技术的全新的图形界面系统和API,它充分利用了计算机的3D显卡硬件功能和Direct3D技术。
WCF(WindowsCommunicationFoundation),内部代码“Indigo”,是一个面向服务的通讯框架,利用它可以实现本地和远程的程序之间的交互。
WF(WorkflowFoundation)于2005年8月公开,微软提供的工作流引擎,通过它可以实现任务的自动化和事务的集成。
InfoCard是一个软件组件的代码,用来安全的保存和使用用户的数字身份,并提供统一的界面来针对特定的事务选择身份,例如登陆一个网站。
类型化变量
classLocalVariables:AppRunner.AbstractApplication
publicoverridevoidRun()
varintValue=5;
varstringValue="Thisisastring";
varcustomClass=newLocalVariables();
foreach(varvalueinintArray)
Console.WriteLine(value);
上面的代码将被解析成:
intintValue=5;
stringstringValue="Thisisastring";
LocalVariablescustomClass=newLocalVariables();
int[]intArray=newint;
foreach(intvalueinintArray)
classAnonymousType:AppRunner.AbstractApplication
CardNumber="10001",Name="van’s",Sex=true
Console.WriteLine(anonymousType1.CardNumber);
Console.WriteLine(anonymousType1.Name);
CardNumber="10002",Name="martin",Sex=true
anonymousType2=anonymousType1;
类型化数组
classAnonymousTypeArray:AppRunner.AbstractApplication
Console.WriteLine(intArray);
Console.WriteLine(doubleArray);
Console.WriteLine(anonymousTypeArray[0].Name);
C#3.0中加入的对象构造者特性,使得对象的初始化工作变得格外简单,我们可以采用类似于数组初始化的方式来初始化类的对象,方法就是直接在创建类对象的表达式后面跟上类成员的初始化代码。具体示例如下:
classPoint
publicoverridestringToString()
return"("+X.ToString()+","+Y.ToString()+")";
classRectangle
publicRectangle()
P1=newPoint();
P2=newPoint();
return"P1:"+P1+",P2:"+P2;
classObjectBuilder:AppRunner.AbstractApplication
Console.WriteLine("Point(X,Y)=",thePoint);
Console.WriteLine(theRectangle);
在theRectangle对象的初始化表达式中,我们首先对P1属性进行初始化,然而P1属性也是一个自定义的类型,所以P1属性的初始化是另一个类型(Point)的初始化表达式,我们可以这样的方式来对更加复杂的类型进行初始化。
C#3.0中加入的集合构造者特性,可使我们享受到与普通数组一样的待遇,从而在创建集合对象的同时为其指定初始值。为了做到这一点,我们需要让我们的集合实现ICollection;接口,在这个接口中,完成初始化操作的关键在于Add函数,当我使用初始化语法为集合指定初始值时,C#编译器将自动调用ICollection;中的Add函数将初始列表中的所有元素加入到集合中,以完成集合的初始化操作。使用示例如下:
classCollectionInitializer:AppRunner.AbstractApplication
classStringCollection:ICollection
publicvoidAdd(stringitem)
Console.WriteLine(item);
//OtherICollectionMembers
在这个示例中,编译器会自动为strings对象调用Add方法,以将初始值列表中的所有元素加入到集合中,这里我们只是简单将初始值列表中的元素输出到控制台。
Lambda表达式
而C#3.0则更进一步,通过Lambda表达式,我们可以一种更为简洁方式编写事件处理代码,新的Lambda事件处理代码看上去就像一个计算表达式,它使用"=>"符号来连接事件参数和事件处理代码。我可以这样写:SomeEvent+=事件参数=>事件处理代码;下面是完整的示例:
delegateTAddDelegate(Ta,Tb);
classLambdaExpression:AppRunner.AbstractApplication
publicstaticeventEventHandlerMyEvent;
MyEvent+=delegate(objects,EventArgse)
Console.WriteLine(s);
MyEvent(this,null);
AddDelegateadd=(a,b)=>a+b;
Console.WriteLine(add("Lambda","Expression"));
在上面的例子中,分别使用了匿名代理和Lambda表达式来实现同样的功能,可以明显看出Lambda表达式的实现更为简洁。我们在使用Lambda表达式编写事件处理代码时,无需指明事件参数的类型,且返回值就是最后一条语句的执行结果。
扩展方法
当我们需要对已有类的功能进行扩展时,我们通常会想到继承,继承已有类,然后为其加入新的行为。而C#3.0中加入的扩展方法特性,则提供了另一种实现功能扩展的方式,我们可以在不使用继承的前提下实现对已有类本身的扩展,这种方法并不会产生新的类型,而是采用向已有类中加入新方法的方式来完成功能扩展。
staticclassExtensions
publicstaticintToInt32(thisstringsource)
returnInt32.Parse(source);
publicstaticT[]Slice(thisT[]source,intindex,intcount)
if(index<0||count<0||index+count>source.Length)
thrownewArgumentException();
T[]result=newT[count];
Array.Copy(source,index,result,0,count);
returnresult;
classExtensionMethods:AppRunner.AbstractApplication
stringnumber="123";
Console.WriteLine(number.ToInt32());
intArray=intArray.Slice(1,2);
foreach(variinintArray)
Console.WriteLine(i);
在上面的示例中,静态的Extensions类中有两个扩展方法,第一个方法是对string类的扩展,它为string类加入了名为ToInt32的方法,该方法没有参数,并返回一个int类型的值,它将完成数字字符向整数的转换。有了这个扩展方法之后,就可对任意string类的对象调用ToInt32方法了,该方法就像其本身定义的一样。
第二个扩展方法是一个范型方法,它是对所有数组类型的扩展,该方法完成数组的切片操作。
C#3.0中的Linq表达式,就是大量运用扩展方法来实现数据查询的。
Linq表达式
C#3.0中加入的最为复杂的特性就是Linq查询表达式了,这使我们可直接采用类似于SQL的语法对集合进行查询,这就使我们可以享受到关系数据查询的强大功能。
Linq查询表达式是建立在多种C#3.0的新特性之上的,这也是我为什么最后才介绍Linq的原因。下面看一个例子:
classLinqExpression:AppRunner.AbstractApplication
//定义匿名数组persons,并为其赋初值
/*
执行简单Linq查询
检索所有年龄在24岁以内的人
查询结果放在results变量中
results变量的类型与数组persons相同
*/
varresults=frompinpersons
wherep.Age<=24
selectp;
foreach(varpersoninresults)
Console.WriteLine(person.Name);
Console.WriteLine();
//定义匿名数组customers,并为其赋初值
//该数组是匿名类型的
OrderNo=0,
OrderName="C#ProgrammingLanguage(SecondEdition)",
OrderDate=newDateTime(2007,9,5)
OrderNo=1,
OrderName="HeadFirstDesignPatterns(ChineseEdition)",
OrderDate=newDateTime(2007,9,15)
OrderNo=2,
OrderName="asp.netUnleashed2.0(ChineseEdition)",
OrderDate=newDateTime(2007,09,18)
OrderNo=3,
OrderName="TheC++ProgrammingLangauge(SpecialEdition)",
OrderDate=newDateTime(2002,9,20)
OrderName="C++ProgrammingLanguage(SpecialEdition)",
OrderDate=newDateTime(2007,9,20)
执行多重Linq查询
检索所在城市为中国,且订单日期为2007年以后的所有记录
查询结果是一个匿名类型的数组
其中包含客户名,订单号,订单日期,订单名四个字段
varsomeCustomers=fromcincustomers
wherec.City=="China"
fromoinc.Orders
whereo.OrderDate.Year>=2007
foreach(varcustomerinsomeCustomers)
Console.WriteLine(
customer.Name+","+customer.OrderName+","+
customer.OrderDate.ToString("D")
);
从上面的例子中,我们可以看到Linq查询的强大特性,它允许我们进行简单查询,或者进行更为复杂的多重连接查询。且查询的结果还可以是自定义的匿名类型。
快速指南
VS2008的多定向支持
VS2008允许你构建针对多个.NET框架版本的应用。你可以从下面的博客贴子里进一步了解其中的工作原理:
VS2008Multi-TargetingSuort
VS2008Web设计器和C支持
VS2008包含一个显著改进的HTMLweb设计器。该设计器提供了分割视图编辑,嵌套母板页,以及出色的C集成。
A.NET还提供了一个新的控件,该控件对数据UI场景提供了非常灵活的支持,允许对输出的标识做完全的定制,与VS2008中的新C支持还有良好的协作。
A.NETAJAX和JavaScript支持
.NET3.5内置提供A.NETAJAX,还添加了支持Weart的UpdatePanel,支持JSON的WCF,以及N个缺陷修补和性能改进等方面的新特性。VS2008还对集成JavaScript和AJAX进你的应用提供了极棒的支持:
VS2008JavaScriptIntellisee
VS2008JavaScriptDebugging
改进和LINQ
VS2008中的新VB和C#编译器对这些语言做了显著的改进。两者都添加了函数式编程概念的支持,允许你编写更干净,更简洁,更具有表达性的代码。这些特性还促成了我们称之为LINQ(语言级集成查询)的新编程模型,使得查询和操作数据成为.NET中的一等编程概念。
自动属性,对象初始化器,和集合初始化器
查询句法
匿名类型
LINQtoSQL中的数据访问改进
Part1:IntroductiontoLINQtoSQL
Part2:DefiningourDataModelClaes
Part3:QueryingourDatabase
Part4:UpdatingourDatabase
Part5:BindingUIusingtheA:LinqDataSourceControl
其他改进
上面的列表只是所做改进的一小部分。针对客户端开发,VS2008包含了WPF设计器和项目支持。ClickOnce和WPFXBA在FireFox中也工作了。WinForms和WPF项目也能使用A.NET应用服务(成员,角色和用户数据)来漫游用户数据了。办公开发也更加丰富了,包括对Office2007Rion的集成支持。WCF和Workflow项目和设计器也包括在VS2008中了。单元测试的速度大为提高,而且单元测试的支持包括在VSProfeional版本(而不仅仅是VSTS版了)中了。连续集成支持也内置于TFS中了。AJAXweb测试(单元和压力)也由VSTest产品支持了。还有许许多多多的改进,这里无法一一提及了。
注意事项
在安装VS2008和.NET3.5Beta2之后,还有2件重要的事情你应该马上做:
1)你应该下载和运行这个批文件。这只要几秒钟就可以运行完,它修补了这个星期早些时候我们发现的System.Web.Exteio.dll版本政策的问题,该程序集包含了A.NETAJAX。如果你不运行这个批文件,那么用A.NETAJAX1.0和VS2005构建的现有的A.NET2.0项目就会自动地运载随.NET3.5Beta2发布的新A.NETAJAX版本。这会工作而且运行良好,但会不小心导致你的VS2005应用依赖于.NET3.5。运行这个批文件会改变新的System.Web.Exteio.dll程序集的版本绑定政策,确保你只在你明确构建.NET3.5项目时才使用新的.NET3.5A.NETAJAX版本。
2)假如你曾经在你的机器上安装过Orcas或VS2008的早期版本(Beta1或某个CTP版本)的话,你需要在安装Beta2后重新设定你的VS2008设置。如果你不这么做的话,有些设置会非常奇怪(一些窗口在出现在奇怪的地方),你也有可能看到一些IDE性能问题。你可以在命令行上对VS2008的IDE版本键入“DevEnv/resetsettings”来重新设定你的配置。
.NET标准控件根据其应用环境分为两类:
Web窗体控件:主要用于Web应用程序的开发。它是专门针对Asp.NETWeb窗体设计的服务器控件。Web窗体控件包含在命名空间System.Web.UI.WebControls中,当用户使用VisualStudio创建Web窗体页面时,会自动在后台代码文件中添加引用该命名空间的Using语句。
.NETCompactFramework提供了可以满足大多数设备项目需要的WindowsForm控件。若要使用这些控件没有的功能,可以从公共控件派生您自己的自定义控件。可以通过定义从Control类或从程序集中的现有UserControl继承的公共类型创建自定义控件。
最简单的控件自定义是重写公共控件的方法。例如,可以重写TextBox控件的OnKeyPress继承方法,提供将输入限制为数字字符的代码。
信息安全是计算机应用的首要问题之一,但关于.NET加密功能的范例却少之又少。有鉴于此,本文探讨了在.NET平台下加密/解密文件的一般过程,并提供了一个加密/解密文件的工具。
Web服务以不容置疑的态势迅速发展,促使许多单位开始考虑.NET之类的开发平台。但是,出于对安全问题的担心,一些单位总是对采用新技术心存顾虑。好在有许多成熟的安全和网络技术,例如虚拟私有网络(VPN)和防火墙等,能够极大地提高Web服务应用的安全和性能,让开发者拥有选择安全技术的自由,而不是非得使用尚在发展之中的XML安全技术不可。
虽然安全是信息系统的首要问题,但有关.NET安全和加密工具的范例却少之又少。看看大多数.NET书籍的目录,找不到任何有关安全的题目,更不用说关于密码系统的探讨了。
有鉴于此,本文将介绍如何在VB开发中运用.NET的加密和密钥生成类,提供一个可用来加密和解密文件的工具Cryption。有了这个工具,你就可以在硬盘上保存各种机密文件,例如所有的密码/用户名字信息、收支文件、以及其他想要保密的信息,还可以加密那些通过Internet发送的文件。加密技术的用途非常广泛,你可以进一步定制本文提供的工具满足某些特殊需要,例如增加批处理能力等。
针对泄密的最佳防范措施就是加密。有效的加密不仅杜绝了泄密,而且还防范了由泄密引发的攻击。加密技术有时还用于通信过程中的身份验证——如果某个用户知道密码,那么他应该就是那个拥有这一身份的人。
首先,要想使用.NET的安全功能,就必须用Imports语句引入加密用的包。试验本文涉及的任何代码之前,请在VB代码窗口的顶部加入下列Imports语句:
ImportsSystem
ImportsSystem.Text
ImportsSystem.Security.Cryptography
第二,美国政府过去限制某些加密技术出口。虽然这些限制不再有效,.NET框架在Windows的出口版本中禁用了“高级”加密技术。如果你的Windows不带高级加密能力,可以从微软网站下载更新包:对于Windows2000,安装ServicePack2包含的HighEncryptionPack;对于NT,安装ServicePack6a。对于WindowsME、95、98的用户,IE5.5也包含了HighEncryptionPack。
本文提供的工具可用来加密和解密文件,如果你急着给一些文件加密,只需直接启动本文后面提供的工具即可。
这个工具提供了一个用来输入文件名字的文本框和一个输入密钥的文本框,通过便捷的用户界面提供加密、解密和密钥生成功能。在图一中,上方的文本框用来输入待加密/解密文件的名字;下面的文本框用来输入8个字符的密码。执行加密操作之后将生成一个新的文件,这个经过加密的文件和原始文件在同一目录下,文件名字也和原始文件的一样,但加上了“xx”后缀,例如,假设原始文件是MyFile.txt,则加密得到的文件是MyFilexx.txt。
加密好之后,原始文件不一定非删除不可,但一般来说最好删除,因为加密的根本目的就是为了隐藏原始文件的数据。如果要从加密后的文件恢复出原始文件,在上面的文本框中输入MyFilexx.txt,然后提供密码,Cryption工具将创建一个与原始文件一样的MyFile.txt文件。也就是说,Cryption把文件名字后面的“xx”看作是要求解密密文的标志。
.NET提供的加密技术不止一种,不过本文讨论的主要是对称加密。对称加密也称为私有密钥加密,它的特点是加密和解密用的是同一个密钥(实际上是同一种算法),解密方和加密方都有责任保障密码的安全(对于公用密钥、不对称加密,密钥一共有两个,其中一个密钥是公开的,这是当前公认最有效的加密技术,但就速度而言要比对称加密算法慢不少)。
在正式利用.NET加密类加密文件之前,首先必须从用户提供的密码生成一个密钥。密钥可以利用Hash函数生成,Hash函数把用户的密码字符串转换成一组类似随机数序列的、无意义的数据,这组数据可作为密钥使用,在加密过程中对原始数据进行唯一性变形处理。
例如,用密钥加密数据的一种办法是把原始数据的ASCII码加上密钥的ASCII码:
密钥:ab=ASCII:97,98
数据:merry=ASCII:109,101,114,114,121
把这组数据的ASCII码加上密钥的ASCII码(必要时重复使用密钥),得到的加密结果是:
9798979897
+109+101+114+114+121
206199211212218
对于同样的数据,Hash算法总是生成同样的结果(这就是说,对于同一个密码,同一Hash算法总是生成相同的bit序列)。实际上,在本文提供的代码中,利用.NET的SHA1CryptoServiceProvider类的ComputeHash方法可以验证这一点,例如,对于同一个输入参数morph,任何时候该方法总是返回下面的结果:124,230,93,253,197,206,136,72。因此,如果有人知道密码以及生成密钥的算法,他也可以轻松地推算出密钥。
.NET加密技术要求密钥有确定的长度,例如,DES(DataEncryptionStandard)函数要求密钥的长度是64位,Rijndael则要求128、192或256位长度的密钥。密钥越长,加密强度越高。对于DES之外的加密算法,查询LegalKeySizes属性即可得到它允许的密钥长度,包括MinSize(支持的最小密钥长度)、MaxSize(最大密钥长度)、SkipSize(增量)。SkipSize表示密钥最大长度和最小长度之间可用长度的间隔,例如,Rijndael算法的SkipSize值是64位。
利用下面的代码可以得到密钥的长度信息:
'创建DES加密对象
DimdesAsNewDESCryptoServiceProvider()
Dimfd()AsKeySizes
fd=des.LegalKeySizes()'tellsusthesize(s),inbits
MsgBox("加密类型="&des.ToString()&Chr(13)&"minsize="&fd(0).MinSize&Chr(13)&_
"maxsize="&fd(0).MaxSize&Chr(13)&"skipsize="&fd(0).SkipSize)
说明:DES算法要求输入一个8字节的密码,但实际使用的密钥只有56位(7个字节),每一个字节的最后一位不用(它作为校验位使用,但不用于实际的加密过程)。
下面的代码开始生成本文示例程序的密钥:
PublicClassForm1
InheritsSystem.Windows.Forms.Form
'保存密钥的8字节的数组
PrivateTheKey(7)AsByte
'在向量中放入一些随机数据
首先,代码定义了保存密钥和初始向量(请参见稍后的详细说明)的两个变量。向量的初值这里用随机数据填充,当然,通过密码和Hash算法也可以获得向量的初值。下面的过程从用户输入的密码创建出密钥:
SubCreateKey(ByValstrKeyAsString)
'保存密钥的字节数组
DimarrByte(7)AsByte
DimAscEncodAsNewASCIIEncoding()
DimiAsInteger=0
AscEncod.GetBytes(strKey,i,strKey.Length,arrByte,i)
'获得密码的Hash值
DimhashShaAsNewSHA1CryptoServiceProvider()
DimarrHash()AsByte=hashSha.ComputeHash(arrByte)
'将Hash值保存到密钥
Fori=0To7
TheKey(i)=arrHash(i)
Nexti
EndSub
用户的密码(strKey)传入到CreateKey过程,分解成一组ASCII值保存到一个字节数组。把这个字节数组传递给SHA1CryptoServiceProvider类的ComputeHash方法,返回一个Hash值。把这个Hash值保存到TheKey数组,供以后的加密/解密过程使用(注意SHA1CryptoServiceProvider实际能够支持160位,但本文示例程序只用到64位)。
那么,初始向量究竟起什么作用呢?这个字节数组有8个元素,就象密钥一样,但向量和密钥的作用是不同的,向量用来避免DES之类的算法一个特有的问题。在DES之类的算法中,原始数据被分成8字节一块然后分别处理。DES在加密一块数据时,要用到前一块数据的模式,也就是说,如果改动了原始数据中第一块的某个字符,所有后继的块的内容都将随之改变,从而避免了一系列相连接的块中出现重复块的问题。
例如,假设你一时高兴,发了一个邮件,内容只有几个重复的单词“Melanie!Melanie!Melanie!Melanie!”,在密钥和块序列中前一块的共同作用下,加密之后的密文不会出现重复现象。然而,进一步考虑这个加密过程可以发现,如果用同一个密钥加密多个邮件,且邮件开头的问候语都相同,则邮件开头的一部分很容易受到攻击。由于这个原因,我们用初始向量来模拟前一个块。
本文加密/解密工具中的下面这段代码示范了如何加密文件:
SubEncrypt(ByValinNameAsString,ByValoutNameAsString)
Try
'创建缓冲区
Dimstorage(4096)AsByte
'已经写入的字节数量
DimtotalBytesWrittenAsLong=8
'每次写入的字节数量
DimpackageSizeAsInteger
DimfinAsNewFileStream(inName,FileMode.Open,FileAccess.Read)
DimfoutAsNewFileStream(outName,FileMode.OpenOrCreate,FileAccess.Write)
fout.SetLength(0)
'源文件的大小
DimtotalFileLengthAsLong=fin.Length
'创建加密对象
DimcrStreamAsNewCryptoStream(fout,_
des.CreateEncryptor(TheKey,Vector),_
CryptoStreamMode.Write)
'输出加密后的文件
WhiletotalBytesWritten
packageSize=fin.Read(storage,0,4096)
crStream.Write(storage,0,packageSize)
totalBytesWritten=Convert.ToInt32(totalBytesWritten+_
packageSize/des.BlockSize*des.BlockSize)
EndWhile
crStream.Close()
CatcheAsException
MsgBox(e.Message)
EndTry
注意这段代码创建了三个文件流:fin,表示明文形式的原始文件;fout,加密结果文件;crStream,加密流,用来把DES加密的结果转入输出文件fout。增加一个crStream流的好处是不必把结果保存到临时文件或缓冲区。
加密过程与解密过程的唯一重要区别是,执行解密时,我们将使用DESCryptoServiceProvider对象的另一个方法CreateDecryptor,除此之外,两者其余的处理步骤(包括参数,文件流,等等)基本相同。
黑客和密码专家破解加密文件的办法主要有两个,第一是搜索密文是否有重复现象,第二是用暴力破解法获得密钥。首先我们考虑一下初始向量如何防止重复现象,然后再探讨一下防止暴力破解的关键问题。
计算机的运算速度和精度要远远超过人,特别擅长处理一些重复的任务,例如尝试每一种可能的密钥组合最终破解密钥。DES加密算法本身是不安全的,这种加密算法早在70年代就已经公之于众。而且,破解者如果想要让搜索密钥的过程自动化,同样可以方便地运用.NET的DESCryptoServiceProvider类。
结束语:现在你已经了解了.NETDES加密算法的使用过程,接下去可以研究.NET的其他安全功能,包括极具吸引力的公用密钥加密方案。虽然公用密钥加密方案执行起来速度慢一些,但加密效果一般要比TripleDES好。
预测未来,在技术世界是常有的事儿。从高级语言的发展历史来看,编程世界从来就没有停止过脚步,变革时时发生、创新处处存在。以技术人员的角度来观摩未来,带着C#4.0的脚步来看展望,除了在函数式编程、并行计算和动态特性上大展拳脚,MetaProgramming的概念已然浮出水面,将编译器变成一个Service,你可以自由控制在编译器和运行期的逻辑,那是多么美好而向往的未来呀,所以,我们坚信4.0之后还有广阔的天地随着语言的变迁变得更加开阔。
概括Anders大师在C#设计过程中的思想,C#是语言美学的集大成者。例如,当使用foreach进行循环遍历之后,当应用using语句代替try/finally实现强制资源管理,当应该attribute进行运行时反射,当以LINQ进行语言级别的信息查询,这些语言级别的支持为C#实现面向对象编程带来强大的功能动力和美学感受。
C#程序设计
C#Primer中文版
.NET框架程序设计(修订版)
c#Windows程序设计
.NET程序设计技术内幕
.NET本质论--第1卷:公共语言运行库(中文版)
2、"-"不能用作开头和结尾。
3、长度不能超过63个字符。
4、简单、易记,逻辑性强(与企业商标、产品名称吻合;根据网站的性质、用途选择)。
5、为同一个域名注册多个不同后缀。
6、域名购买年限选择2年以上。
2、域名注册时候最好选择好用、易记的域名,以便于宣传和推广。
4、除了传统的.cn、.com、.net等纯英文域名后缀之外,还有以“.中国”结尾的纯中文域名,并且注册“中文.CN”将自动获得对应的“中文。中国”域名,获赠繁体中文,无需另行申请注册。
对于企业用户,最好还要注册自己的中文域名,做到面面俱全,以锁定自己在互联网上绝对安全和品牌垄断权。
5、为避免域名过期导致要高价赎回,或是被抢注而要付出高成本代价,或是解析暂停影响网站访问的情况,按时续费也是非常重要的。所有域名过期后30天内可正常续费。
1.微软宣布.NET开源!支持MacOSX和Linux·太平洋电脑网(引用日期:2014-11-14)
智能障碍是一组临床综合征,可有记忆、认知(概括、计算、判断等)、语言、视空间功能和人格等至少3项受损。智能障碍常由神经系统疾病、精神疾病和躯体疾病引起。智能障碍的主要症状包括记忆障碍、认知与判断障碍、人格改变、情感障碍。智能障碍的治疗主要是针对脑部原发病的治疗及康复治疗。智能障碍给患者的正常生活、学
脑血管病是指脑部血管的各种疾病引起脑组织的缺血或出血性损伤,包括脑动脉粥样硬化、血栓形成、脑血管狭窄或闭塞、脑动脉炎、脑动脉损伤、脑动脉瘤、颅内血管畸形、脑动静脉瘘等。脑血管病的病因包括血脂异常、动脉粥样硬化、脂肪透明样变性纤维蛋白坏死、纤维肌肉发育不良、血管淀粉样变、血管炎、静脉血栓、血管痉挛等。
疮疡是指各种致病因素侵袭人体后引起的一切体表化脓感染性疾病的总称,包括急性和慢性两大类。中国古代用以泛指多种外科疾患,后世将外科分为疮疡与杂证两大类。疮疡多由毒邪内侵,邪热灼血,以致气血凝滞而成。其包括了体表上的肿疡及溃疡、痈、疽、疔疮、疖肿、流注、流痰、瘰疬及有关皮肤病的内容,是中医外科疾病中最常
幼发拉底河是中东最重要的河流之一,全长约2800千米,发源于土耳其的安纳托利亚和亚美尼亚高原山区,依赖雨雪补给。它流经叙利亚和伊拉克,最终与底格里斯河在伊拉克的沙特阿拉伯汇合,形成阿拉伯河,注入波斯湾。幼发拉底河与底格里斯河共同界定了美索不达米亚,被认为是文明的起源地之一,对中东地区尤其是伊拉克的历
《太平寰宇记》是古代中国地理志史,记述了宋朝的疆域版图。广泛引用历代史书、地志、文集、碑刻、诗赋以至仙佛杂记等,计约二百种,且多注明出处,保留了大量珍贵的史料。宋太宗赵炅时地理总志;乐史撰,二百卷,是继《元和郡县志》后又一部现存较早较完整的地理总志。
黄海本词条是多义词,共55个义项台湾科幻及文学作家黄海,男,本名黄炳煌,台湾作家。