NET 技术FAQ.docx
- 文档编号:17026704
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:36
- 大小:38.64KB
NET 技术FAQ.docx
《NET 技术FAQ.docx》由会员分享,可在线阅读,更多相关《NET 技术FAQ.docx(36页珍藏版)》请在冰点文库上搜索。
NET技术FAQ
1.1什么是.NET?
很难用一句话来讲清楚。
根据Microsoft的说法,.NET是一个“革命性的新平台,建立在开放的Internet协议和标准之上,通过工具和服务将计算和通讯以崭新的方式融合到一起”。
更为实际的定义是:
.NET是一个开发和运行软件的新环境,便于开发基于Web的服务,拥有丰富的运行库服务以支持用多种编程语言编写的组件,具有跨语言和跨平台的互操作能力。
注意,本文中使用术语“.NET”时,它仅指新的.NET运行库及其相关技术。
有时我们也称其为“.NET框架”。
本文不包括其它Microsoft正在往上添加.NET名字的任何现有的产品和技术(例如SQLServer.NET)。
1.2.NET只是WindowsDNA的一个新名字吗?
不。
在很多地方,WindowsDNA仅仅是指使用现有技术的一种途径(即所谓的三阶式途径)的市场术语。
.NET更为急进,并且包括一个完整的软件开发和运行库框架。
1.3.NET只适用于建立Web网站吗?
不。
如果你编写任何Windows软件(使用ATL/COM、MFC、VB甚至Win32裸接口),.NET都可能为你正在做的事情提供可行的选择(或补充)。
当然,如果你就是在开发Web网站,.NET有很多令你感兴趣的东西—不仅仅是ASP+。
1.4.NET是在什么时候宣布的?
在2000年6月22日举行的Forum2000论坛上,BillGates做了一次演说,勾画了.NET的“前景”。
2000年7月的PDC会议上针对.NET技术做了很多会谈,会谈代表得到了包含.NETFramework/SDK和VisualStudio7预览版的光盘。
1.5.NET将在何时发布?
预计是在2001年的下半年。
1.6如何开发.NET应用程序?
.NETFrameworkSDK包含可用于建立.NET应用程序的命令行编译器和实用程序。
VisualStudio的下一版本(称为VisualStudio7或VisualStudio.NET)将完全集成对.NET开发的支持。
1.7可以从哪里下载.NETSDK和VisualStudio7?
从可以下载SDK的Beta1版。
如果你是MSDNUniversal订户,你还可以下载VisualStudio7的Beta1版。
1.8.NET中的关键技术是什么?
ASP.NET、CLR(CommonLanguageRuntime—通用语言运行库)、C#(新一代的类-Java语言)、SOAP、XML、ADO.NET、多语言支持(Eiffel、COBOL等等)
1.9.NET框架将运行在什么平台上?
Beta1支持在Windows2000、NT4SP6a,WindowsMe和Windows98上进行开发。
Windows95支持运行库。
Microsoft将按照和.NET运行库相似的时间表发布一个新版本Windows。
它的代号是“Whistler”,在很大程度上是对Windows2000的扩充性更新,对GUI有重要的改变。
Microsoft将以“.NET-enabled”作为新操作系统的卖点,但看起来它没有和.NET运行库绑在一起。
如果.NET运行库能及时完成,它将包含在Whistler之内;否则,Whistler将单独发货。
1.10.NET框架支持什么语言?
开始Microsoft将提供C#、C++、VB和JScript编译器。
其它供应商宣布他们有意开发像COBOL、Eiffel、Perl、Smalltalk和Python等语言的.NET编译器。
1.11.NET框架符合标准化趋势吗?
C#以及称为“通用语言基础结构”的一些东西的推荐标准草案已经提交给了ECMA。
参见
2.基本术语
2.1什么是CLR?
CLR=CommonLanguageRuntime—通用语言运行库。
CLR是一组标准资源集合,无论编程语言是什么,所有(理论上).NET程序都能从中获益。
RobertSchmidt(Microsoft)在他的MSDNPDC#文章中列出了以下CLR资源:
面向对象的编程模型(继承、多态、异常处理、垃圾收集)
安全模型
类型系统
所有的.NET基础类
许多.NET框架类
开发、调试和测评工具
运行和代码管理
IL-机器语言转换器和优化器
这些的含义是,在.NET世界里,不同的编程语言将在能力上比过去任何时候都更平等,虽然显然不是所有语言都支持所有CLR服务。
2.2什么是CTS?
CTS=CommonTypeSystem—通用类型系统。
它是指.NET运行库所理解、并且随后.NET应用程序可以使用的一系列类型。
然而,注意不是所有的.NET语言都将支持CTS中的所有类型。
CTS是CLS的超集。
2.3什么是CLS?
CLS=CommonLanguageSpecification—通用语言规范。
它是预计所有.NET语言都支持的一个CTS的子集。
这一思想是让使用CLS-相容类型的任何程序和以任何语言编写的.NET程序可以互相操作。
理论上它能允许在不同的.NET语言之间有紧密的互操作性—例如允许从一个VB类里继承一个C#类。
2.4什么是IL?
IL=IntermediateLanguage—中间语言。
又称为MSIL。
所有.NET源代码(使用任何语言)被编译为IL。
然后在软件的安装点上或者运行时,IL由即时(JIT)编译器转换为机器码。
2.5什么是C#?
C#是在.NET框架中运行的一种新语言。
在他们的“C#简介”白皮书中,Microsoft这样描述C#:
“C#是从C和C++派生出来的一种简单的、面向对象的、并且是类型安全的现代编程语言。
C#(发音为‘Csharp’)牢固地根植于在C和C++家族之树,将很快为C和C++程序员所熟悉。
C#帮助开发者将VisualBasic的高生产率和C++的直接控制能力结合起来。
”
将以上引言中的“C#”换成“Java”,你会发现这句陈述依然很正确:
)。
假如你是一位C++程序员,你可能想看看我的C#FAQ。
2.6在.NET范畴里,“被管理”是什么含义?
术语“被管理”导致了很多误解。
在.NET里的不同地方都使用了它,分别指相互差别不大的不同东西。
被管理代码:
.NET框架为运行在其上的程序提供了几个核心的运行服务—例如异常处理和安全性。
为使这些服务能工作,代码必须提供运行时的最低程度的一些信息。
这样的代码被称为被管理代码。
默认情况下,所有C#、VisualBasic.NET和JScript.NET代码都是被管理代码。
如不指明,VS7C++代码不是被管理代码,但能通过一个命令行开关(/com+)使编译器产生被管理代码。
被管理数据:
是指由.NET运行库的垃圾收集器分配和回收的数据。
C#、VB.NET和JScript.NET数据总是被管理的。
即使使用了/com+开关,默认情况下VS7C++数据也不是被管理的,但可以使用__gc关键字将其指定为被管理数据。
被管理类:
通常在C++的ManagedExtensions(ME)范畴中涉及。
使用MEC++时,可以用__gc关键字将其指定为被管理的。
名副其实,该类的实例所占用的内存由垃圾收集器管理,但还不止如此。
该类还成为了完全的.NET团体的成员,同时带来了好处和限制。
好处之一是获得了与其它语言编写的类之间的互操作性—例如,一个被管理C++类可以继承VB类。
限制之一是被管理类只能继承一个基类。
2.7什么是映像?
所有的.NET编译器都产生关于它们所产生的模块中的类型定义的特殊数据。
这些特殊数据同模块封装在一起(随后模块被封装到元件中),可以通过称为映像的机制来访问。
System.Reflection命名空间中包含向模块或元件询问其类型的类。
使用映像来访问.NET的特殊数据同使用ITypeLib/ITypeInfo来访问COM中的类型库数据非常相似,而且使用的目的也很相似—例如确定数据类型大小,以便在上下文、进程、机器的边界间调度它们。
映像还可以被用来动态调用方法(参见System.Type.InvokeMember),甚至在运行时动态创建类型(参见System.Reflection.Emit.TypeBuilder)。
3.元件
3.1什么是元件?
元件有时被描述为一个逻辑上的.EXE或.DLL,它可以是任何一个应用程序(有一个主入口点)或库。
一个元件由一个或多个文件组成(dll、exe、html文件等等),表示一组资源、类型定义以及这些类型的实现。
一个元件也可以包含对其它元件的引用。
这些资源、类型和引用在称为清单的一个数据块中描述。
清单是元件的一部分,这样一来元件就是自描述的。
元件的一个重要方面使他们是一个类型的唯一标志的一部分。
类型的唯一标志是将它所在的元件和类型名组合在一起得到的。
这就是说,例如,如果元件A输出了一个称为T的类型,同时元件B输出了一个也称为T的类型,.NET运行库将它们视为完全不同的两个类型。
此外,不要混淆元件和命名空间—命名空间仅仅是组织类型名字的一种层次化方法。
对于运行库,不论使用哪一个命名空间来组织名字,类型名就是类型名。
从运行库来看,是元件加上类型名(无论类型名属于哪个命名空间)唯一地标识出一个类型。
元件在.NET的安全方面也很重要—许多安全限制是在元件的边界上实施的。
最后,元件是.NET中版本控制的单元—详情见下文。
3.2怎样创建元件?
创建元件最简单的方法是直接使用.NET编译器。
例如,以下C#程序:
publicclassCTest
{
publicCTest()
{
System.Console.WriteLine("HellofromCTest");
}
}
能用以下方法编译为一个库元件(dll):
csc/t:
libraryctest.cs
通过运行.NETSDK所带的“IL反汇编”工具,你能看到元件的内容。
另外你也能把你的源代码编译成模块,然后使用元件连接器(al.exe)将模块组合成一个元件。
对C#编译器,/target:
module开关可以指定产生模块而不是元件。
3.3私有元件和共享元件有什么不同?
空间分配和可见性:
私有元件通常由一个应用程序使用,被存储到这个应用程序的目录或其下的子目录之下。
共享元件通常存储到全局的元件缓冲区中,这里是.NET运行库维护的元件的储藏所。
共享元件通常是许多应用程序都要用到的代码库,例如.NET框架类。
版本控制:
运行库只对共享元件实施版本约束,而不对私有元件实施。
3.4元件如何相互找到?
通过寻找目录路径。
有几个因素会影响路径(比如AppDomain宿主、应用程序配置文件等),但对于私有元件,搜索路径通常是应用程序的目录及其子目录。
对于共享元件,搜索路径通常和私有元件的一样,再加上共享元件缓冲区。
3.5元件版本如何起作用?
每个元件由一个称为兼容性版本的版本号。
同样,对元件的引用(从另一个元件)包括被引用元件的名称和版本。
版本号有四个数字部分(例如5.5.2.33)。
前两部分不相同的元件被视为不兼容的。
如果前两部分相同,但第三部分不同,元件被认为“可能兼容”。
如果仅仅第四部分不同,则元件被视为是兼容的。
然而,这只是默认的指导方针—是版本策略决定施用这些规则的范围。
版本策略可以在应用程序配置文件中指定。
记住:
版本控制仅仅针对于共享元件,而不对私有元件。
4.应用程序域
4.1什么是应用程序域?
应用程序域(AppDomain)可以被看作一个轻型的进程。
在一个Win32进程中可以存在多个AppDomain。
AppDomain的主要目的是将应用程序和其它应用程序隔离开来。
通过使用独立的地址空间,Win32进程提供隔离性。
这种方法很有效,但开销很大并且伸缩性不好。
.NET运行库通过控制对内存的是用来施加AppDomain隔离—AppDomain中的所有内存是由.NET运行库来管理的,所以运行库可以确保AppDomain之间不能访问彼此的内存。
4.2如何创建AppDomain?
AppDomains通常有宿主创建。
宿主包括WindowsShell、ASP+和IE。
当你从命令行运行一个.NET应用程序时,宿主是Shell。
Shell为每个应用程序创建一个新的AppDomain。
AppDomains也可以由.NET应用程序来显式创建。
这里是一个创建AppDomain的一个C#例子,它创建对象的一个实例,并随后执行对象的一个方法:
usingSystem;
usingSystem.Runtime.Remoting;
publicclassCAppDomainInfo:
MarshalByRefObject
{
publicstringGetAppDomainInfo()
{
return"AppDomain="+AppDomain.CurrentDomain.FriendlyName;
}
}
publicclassApp
{
publicstaticintMain()
{
AppDomainad=AppDomain.CreateDomain("Andy'snewdomain",null,null);
ObjectHandleoh=ad.CreateInstance("appdomaintest.exe","CAppDomainInfo");
CAppDomainInfoadInfo=(CAppDomainInfo)(oh.Unwrap());
stringinfo=adInfo.GetAppDomainInfo();
Console.WriteLine("AppDomaininfo:
"+info);
return0;
}
}
4.3我能编写自己的.NET宿主吗?
能。
关于怎样来做的例子,看看JasonWhittington和DonBox开发的moniker的源代码(.NETSDK中也有一个叫作CorHost的代码示例。
5.垃圾收集
5.1什么是垃圾收集?
垃圾收集是一个系统,运行库组件通过它来管理对象的生存周期和它们占用的堆内存。
对.NET而言它并不是一个新概念—Java和许多其它语言/运行库使用垃圾收集已经有一段时间了。
5.2对对象的最后一个引用撤销后,它并不一定立即被破坏,对吗?
是的。
垃圾收集器并不提供销毁对象并是放其内存的时间保证。
关于C#中隐含的非确定化对象析构,ChrisSells有一个令人感兴趣的线索:
2000年10月,Microsoft的BrianHarry贴出了一个针对这个问题的很长的分析:
ChrisSells对Brian贴子的答复在这里:
5.3.NET为什么不提供确定化的析构?
因为垃圾收集算法。
.NET的垃圾收集器通过周期地扫描应用程序正在使用的所有对象的列表来工作。
扫描过程中所有未被发现的对象就可以被销毁并释放内存。
当对对象的最后一个引用撤销后,算法的这种实现使运行库不能立即得到通知—它只能在下一次清理堆时发现。
而且,这种算法尽可能少地进行垃圾收集,以便工作得最有效率。
通常,堆容量的消耗会触发收集过程。
5.4在.NET中缺少确定化的析构有问题吗?
这确实会影响组件的设计。
如果你的对象需要昂贵或紧缺的资源(例如对数据库的锁定),你需要提供某种方法让客户端在工作完成后能告诉对象以释放资源。
Microsoft建议,为此目的你应提供一个称为Dispose()的方法。
然而,这样会在分布式对象中引起问题—在一个分布式系统中由谁来调用Dispose()方法?
需要有某种形式的引用-计数机制或所有者管理机制来处理分布式对象—不幸的是运行库对此爱莫能助。
5.5确定化的析构是否影响在被管理代码中使用COM对象?
是的。
从被管理代码中使用COM对象时,你实际上是依赖垃圾收集器来最终释放你的对象。
如果你的COM对象占有昂贵的资源且只能在最终释放对象后才能释放,你可能需要在你的对象上提供一个新接口以支持显式的Dispose()方法。
5.6我听说应该避免使用Finalize方法,那么是否应该在我的类理实现Finalize?
对垃圾收集器而言,拥有Finalize方法的对象比没有此方法的对象需要做更多的工作。
同时也不保证对象Finalized的次序,所以对于从Finalized方法访问其它对象有不同的看法。
最后,不能保证Finalized方法一定能被调用。
所以,永远不应该依赖它来清理对象的资源。
Microsoft建议使用以下方式:
publicclassCTest
{
publicoverridevoidDispose()
{
...//Cleanupactivities
GC.SuppressFinalize(this);
}
protectedoverridevoidFinalize()
{
Dispose();
}
}
一般情况下客户端调用Dispose(),对象的资源被释放,并且通过调用SuppressFinalize(),垃圾收集器被免除了对它进行Finalize的义务。
在最不利的情况下,即客户端忘记了调用Dispose(),有很大的机会通过垃圾收集器调用Finalize()来最终释放对象的资源。
由于垃圾收集算法的缺陷,这看起来像是相当合理的处理办法了。
5.7我有控制垃圾收集算法的手段吗?
有一点。
System.GC类提供了一对有趣的方法。
第一个是Collect方法—它强制垃圾收集器立即收集所有未被引用的对象。
另一个是RequestFinalizeOnShutdown(),它告诉垃圾收集器在应用程序关闭时一定要对每个对象运行Finalize()方法。
在应用程序关闭时,垃圾收集器一般优先选择快速的推出方式而不是调用Finzlize(),所以这个方法能手工强制运行库多负一点责任。
如果你想验证这不仅仅是理论上的说法,是一十下面的测试程序:
usingSystem;
classCTest
{
protectedoverridevoidFinalize()
{
Console.WriteLine("ThisistheFinalizer.");
}
}
classCApplication
{
publicstaticvoidMain()
{
Console.WriteLine("ThisisMain.");
CTesttest=newCTest();
//GC.RequestFinalizeOnShutdown();
}
}
运行此程序,然后再去掉GC.RequestFinalizeOnShutdown()这一行前面的注释标记并重新运行,注意有什么不同……
5.8我怎么知道垃圾收集器在做什么?
.NET运行库中很多令人感兴趣的统计通过'COM+Memory'性能对象输出。
使用PerformanceMonitor查看它们。
6.属性
6.1什么是属性?
最少有两种类型的.NET属性。
第一类我称其为metadata属性—它允许将某些数据附加到类或方法上。
这些数据称为类的metadata的一部分,并且可以像类的其它metadata一样通过映射来访问。
metadata的另一种属性是[serializable],将它附加到类上表示类的实例可以被串行化。
[serializable]publicclassCTest{}
另一种类型的属性是上下文属性。
上下文类型的属性使用和metadata相似的语法,但实际上它们是不同的。
上下文类型属性提供一种解释机制,通过这种机制,实例的活动和方法调用可以是预先处理和/或随后处理的。
如果你了解KeithBrown的通用委托器你可能熟悉这种思想。
6.2我能创建自己的metadata属性吗?
是的。
简单地从System.Attribute导出一个类并将其标记为AttributeUsage属性。
例如:
[AttributeUsage(Attribute
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NET 技术FAQ 技术 FAQ
![提示](https://static.bingdoc.com/images/bang_tan.gif)