1.C#中的垃圾回收机制是怎样的?
垃圾回收器是用来管理应用程序的内存分配和释放的。当一个应用程序在运行的时候,垃圾回收器设置了一个托管堆。每次当开发人员使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。新创建的对象被放在上次创建的对象之后。垃圾回收器保存了一个指针,该指针总是指向托管堆中最后一个对象之后的内存空间。当新的对象被产生时,运行库就知道应该将新的对象放在内存的什么地方。当垃圾回收器的指针指向托管堆以外的内存空间时,就需要回收内存中的垃圾了。在这个过程中,垃圾回收器首先假设在托管堆中所有的对象都需要被回收。然后它在托管堆中寻找被根对象引用的对象(根对象就是全局,静态或处于活动中的局部变量以及寄存器指向的对象),找到后将它们加入一个有效对象的列表中,并在已经搜索过的对象中寻找是否有对象被新加入的有效对象引用。直到垃圾回收器检查完所有的对象后,就有一份根对象和根对象直接或间接引用了的对象的列表,而其它没有在表中的对象就被从内存中回收
6 .NET 中的3C
通用类型系统(CTS:Common Type System):为了实现语言的互操作性,必须有一组各种语言都认可的基本数据类型,这样才能对所有的语言进行标准化处理。CTS 就提供了这个功能,还提供了定义定制类的功能。
公共语言规范(CLS:Common Language Specification):这是确保代码可以在任何语言中访问的最小集合,所有用于.Net的编译器都应该该支持CLS。CLS构成了可以在.Net 和 IL中使用的功能子集,代码也可以使用CLS外部的功能。如果非CLS功能在代码所在的装配件外部是可见的,那么这些功能就不能在某些语言中使用。
公共语言运行时(CLR:Common Language Runtime):它实际上管理代码,他可以处理加载程序、运行程序的代码以及提供所有支持服务的代码。
7. 请解释转发与跳转的区别?
在开发WEB系统中,我们都会遇到这样的一种情况,一个页面处理完信息,还有一些处理需要其它页面继续处理,这时候就会有两个选择,是使用页面跳转还是使用请求转发呢?
8.请简述一下用Socket进行同步通讯编程的详细步骤
A、在应用程序和远程设备中使用协议和网络地址初始化套接字
B、在应用程序中通过指定端口和地址建立监听
C、远程设备发出连接请求
D、应用程序接受连接产生通信scoket
E、应用程序和远程设备开始通讯(在通讯中应用程序将挂起直到通讯结束)
F、通讯结束,关闭应用程序和远程设备的Socket回收资源
9、在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
string str = null 是不给他分配内存空间,而string str = “”给它分配长度为空字符窜的内存空间.
10、了解程序集强签名吗
用强名称来给程序集签名即谓之程序集强签名!
那什么是强名称,签名又有什么作用?,我们先看看强名称的概念是什么,强名称是由程序集的标识加上公钥和数字签名组成的,其中程序集的标识包括简单文本名称,版本号和区域性信息!
Visual Studio.NET 和 .NET Framework SDK 中有工具能够将强名称分配给一个程序集!强名称相同的程序集一般也是相同的!
好了,具体我们可以通过给程序集强签名达到什么目的呢?
通过签发具有强签名的程序集合,可以确保名称的全局唯一性!因为强名称是依赖于唯一的密钥对来确保名称的唯一性,其他人不会生成与你相同的程序集名称(不同的私钥产生的名称不同)
强名称保护程序集的版本沿袭,因为强名称的唯一性能够确保没有其他人能够生成你的程序集的后续版本
强名称提供可靠的完整性检查,通过.NET Framework安全检查后,可以确保程序集内容在生成后未被更改过!
要注意的是,具有强名称的程序集引用其他程序集,如果这个程序集没有强名称,那么具有强名称的程序集所带来的好处,并依旧会产生DLL冲突!因此具有强名称的程序集只能引用其他具有强名称的程序集。
本主题描述应用程序域和程序集之间的关系。您必须首先将一个程序集加载到应用程序域中,然后才能运行该应用程序。运行普通的应用程序会导致将几个程序集加载到一个应用程序域中。默认情况下,公共语言运行库将一个程序集加载到包含引用该程序集的代码的应用程序域。通过此方法,该程序集的代码和数据独立于使用该程序集的应用程序。
如果程序集由一个进程中的多个域使用,则该程序集的代码(而非数据)可以由引用该程序集的所有域来共享。这将降低运行时所使用的内存量。这种共享程序集代码的方法类似于 Microsoft Win32 API LoadLibrary 在引用同一 DLL 的进程之间共享代码页的方法。当一个程序集的代码可以由进程中的所有域共享时,可以认为该程序集是非特定于域的。运行库宿主决定在将运行库加载到进程中时是否以非特定于域的形式加载程序集。有关更多信息,请参见 CorBindToRuntimeEx 文档;在 .NET Framework SDK 的公共语言运行库宿主接口规范中可以找到该文档。
有三个选项用于加载非特定于域的程序集:
不以非特定于域的形式加载任何程序集(Mscorlib 除外,它始终以非特定于域的形式加载)。此设置称作单域,因为它通常用在宿主只运行进程中的单个应用程序时。
以非特定于域的形式加载所有程序集。此设置用于以下情况:进程中有多个应用程序域,所有这些应用程序域均运行相同的代码。
以非特定于域的形式加载具有强名称的程序集。当在同一进程中运行多个应用程序时使用此设置。
当您决定是否以非特定于域的形式加载程序集时,必须在减少内存占用和降低性能之间加以权衡。如果程序集包含被频繁访问的静态数据或静态方法,则非特定于域的程序集的执行速度会较慢。对静态数据或静态方法的访问较慢的原因在于需要隔离应用程序。访问该程序集的每一应用程序域都必须具有静态数据或静态方法的单独副本,以避免跨域边界引用静态变量中的对象。因此,运行库包含附加的逻辑,用以将调用方引导到静态数据或静态方法的适当副本。这一额外的逻辑将降低调用速度。
如果在每个域中向一个程序集授予一组不同的权限,该程序集将不在各域间共享。当运行库宿主设置了应用程序域级别的安全策略时,就可能发生此情况。如果向程序集授予的权限组在每个域中都是不同的,则不应以非特定于域的形式加载程序集。
程序集是 .NET Framework 编程的基本组成部分。程序集执行以下功能:
无论怎样试图避免与共享程序集打交道,仍然会遇到需要在多个应用程序之间共享程序集的情况。共享程序集与私有程序集主要存在两方面的区别:位置和标识。私有程序集必须为于应用程序所在目录或子目录中,而共享程序集安装在被称为全局程序集缓存(Global Assembly Cache,GAC)的一个特定的全局缓存中。在Windows操作系统中,GAC位于Windows系统目录下的Assembly目录中(例如:C:/WinNT/Assembly)。
虽然共享程序集友好名称与私有程序集一样,但是.NET运行库通过强名(strong name)(也称共享名:shared name)来标识共享程序集。一个强名称由友好名称(如MathLibrary)、区域信息(如:英语)、版本号(如1.2.0.0)、公钥(public key)和数字签名等组成。这里,需要强名称提供的严格认证等级,因为:
● 希望本公司开发的程序集具有唯一的名称,且不会被其他公司复制。
● 希望针对不同的实现方式或不同的区域信息,能够共享多个不同版本的程序集。
● 防止黑客的“特洛伊木马”程序集替代合法程序集,利用有效访问权限对系统进行严重破坏。
为了更为清楚地说明这些问题,下面举例说明MathLibrary程序集转换成共享程序集的步骤。
1.4.1 私有程序集
私有程序集是最简单的一种程序集类型。私有程序集一般附带在某些软件上,且只能用于该软件中。附带私有程序集的常见情况是,以可执行文件或许多库的方式提供应用程序,这些库包含的代码只能用于该应用程序。
系统可以保证私有程序集不被其他软件使用,因为应用程序只能加载位于主执行文件所在文件夹或其子文件夹中的程序集。
用户一般会希望把商用软件安装在它自己的目录下,这样软件包没有覆盖、修改或加载另一个软件包的私有程序集的风险。私有程序集只能用于自己的软件包,这样,用户对什么软件使用它们就有了更多的控制。因此,不需要采取安全措施,因为这没有其他商用软件用某个新版本的程序集覆盖原来的私有程序集的风险(但软件是专门执行怀有恶意的损害性操作的情况除外)。名称也不会有冲突。如果私有程序集中的类正巧与另一个人的私有程序集中的类同名,是不会有问题的,因为给定的应用程序只能使用私有程序集的名称。
因为私有程序集完全是自含式的,所以安装它的过程就很简单。只需把相应的文件放在文件系统的对应文件夹中即可(不需要注册表项),这个过程称为“0影响(xcopy)安装”。
1.4.2 共享程序集
共享程序集是其他应用程序可以使用的公共库。因为其他软件可以访问共享程序集,所以需要采取一定的保护措施来防止以下风险:
● 名称冲突,另一个公司的共享程序集执行的类型与自己的共享程序集中的类型同名。因为客户机代码理论上可以同时访问这些程序集,所以这是一个严重的问题。
● 程序集被同一个程序集的不同版本覆盖——新版本与某些已有的客户机代码不兼容。
这些问题的解决方法是把共享程序集放在文件系统的一个特定的子目录树中,称为全局程序集高速缓存(GAC)。与私有程序集不同,不能简单地把共享程序集复制到对应的文件夹中,而需要专门安装到高速缓存中,这个过程可以用许多.NET工具来完成,其中包含对程序集的检查、在程序集高速缓存中设置一个小的文件夹层次结构,以确保程序集的完整性。
为了避免名称冲突,共享程序集应根据私有密钥加密法指定一个名称(私有程序集只需要指定与其主文件名相同的名称即可)。该名称称为强名(strong name),并保证其惟一性,它必须由要引用共享程序集的应用程序来引用。
与覆盖程序集相关的问题,可以通过在程序集清单中指定版本信息来解决,也可以通过同时安装来解决。
包含公共语言运行库执行的代码。如果可移植可执行 (PE) 文件没有相关联的程序集清单,则将不执行该文件中的 Microsoft 中间语言 (MSIL) 代码。请注意,每个程序集只能有一个入口点(即 DllMain、WinMain 或 Main)。
程序集形成安全边界。程序集就是在其中请求和授予权限的单元。有关应用于程序集的安全边界的更多信息,请参见程序集安全注意事项。
程序集形成类型边界。每一类型的标识均包括该类型所驻留的程序集的名称。在一个程序集范围内加载的 MyType 类型不同于在其他程序集范围内加载的 MyType 类型。
程序集形成引用范围边界。程序集的清单包含用于解析类型和满足资源请求的程序集元数据。它指定在该程序集之外公开的类型和资源。该清单还枚举它所依赖的其他程序集。
程序集形成版本边界。程序集是公共语言运行库中最小的可版本化单元,同一程序集中的所有类型和资源均会被版本化为一个单元。程序集的清单描述您为任何依赖项程序集所指定的版本依赖性。有关版本控制的更多信息,请参见程序集版本控制。
程序集形成部署单元。当一个应用程序启动时,只有该应用程序最初调用的程序集必须存在。其他程序集(例如本地化资源和包含实用工具类的程序集)可以按需检索。这就使应用程序在第一次下载时保持精简。有关部署程序集的更多信息,请参见部署应用程序。
程序集是支持并行执行的单元。有关运行多个程序集版本的更多信息,请参见程序集和并行 (side-by-side) 执行。
程序集可以是静态的或动态的。静态程序集可以包括 .NET Framework 类型(接口和类),以及该程序集的资源(位图、JPEG 文件、资源文件等)。静态程序集存储在磁盘上的可移植可执行 (PE) 文件中。您还可以使用 .NET Framework 来创建动态程序集,动态程序集直接从内存运行并且在执行前不存储到磁盘上。您可以在执行动态程序集后将它们保存在磁盘上。
有几种创建程序集的方法。您可以使用过去用来创建 .dll 或 .exe 文件的开发工具,例如 Visual Studio .NET。您可以使用在 .NET Framework SDK 中提供的工具来创建带有在其他开发环境中创建的模块的程序集。您还可以使用公共语言运行库 API(例如 Reflection.Emit)来创建动态程序集。
应用程序域概述
以前使用进程边界来隔离在同一台计算机上运行的应用程序。每一个应用程序被加载到单独的进程中,这样就将该应用程序与在同一台计算机上运行的其他应用程序相隔离。
隔离这些应用程序的原因在于内存地址是与进程相关的;在目标进程中,不能通过任何有意义的方式使用从一个进程传递到另一个进程的内存指针。此外,您不能在两个进程间进行直接调用。您必须代之以使用代理,它提供一定程度的间接性。
托管代码必须先通过一个验证过程,然后才能运行(除非管理员已授权跳过该验证)。此验证过程将验证以下内容:这些代码是否会尝试访问无效的内存地址?是否会尝试执行某些导致进程(该代码运行时所在的进程)无法正常进行的其他操作?通过此验证测试的代码将被认为是类型安全的。由于公共语言运行库能够验证代码是否为类型安全的代码,所以它可以提供与进程边界一样大的隔离级别,而其性能开销则要低得多。
应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。您可以在具有同等隔离级别(存在于单独的进程中)的单个进程中运行几个应用程序域,而不会造成进程间调用或进程间切换等方面的额外开销。在一个进程内运行多个应用程序的能力显著增强了服务器的可伸缩性。
隔离应用程序对于应用程序安全也是十分重要的。例如,您可以在单个浏览器进程中运行几个 Web 应用程序中的控件,同时使这些控件不能访问彼此的数据和资源。
应用程序域所提供的隔离具有以下优点:
在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。
能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。
注意 不能卸载单个程序集或类型。只能卸载整个域。
在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源。为了强制实施此隔离,公共语言运行库禁止在不同应用程序域中的对象之间进行直接调用。要在各域之间传递对象,可以复制这些对象,或通过代理访问这些对象。如果复制对象,那么对该对象的调用为本地调用。也就是说,调用方和被引用的对象位于同一应用程序域中。如果通过代理访问对象,那么对该对象的调用为远程调用。在此情况下,调用方和被引用的对象位于不同的应用程序域中。域间调用所采用的远程调用结构与两个进程间的调用或两台计算机间的调用结构相同。因此,被引用的对象的元数据必须对于两个应用程序域均可用,以便用 JIT 正确编译该方法调用。如果调用域无法访问被调用对象的元数据,则编译可能会失败,引发 System.IO.FileNotFound 类型的异常。有关详细信息,请参见使用 .NET 远程处理访问其他应用程序域中的对象。确定如何跨域访问对象的机制是由该对象决定的。有关更多信息,请参见 MarshalByRefObject 类。
代码行为的作用范围由它运行所在的应用程序决定。换言之,应用程序域将提供应用程序版本策略等配置设置、它所访问的任意远程程序集的位置,以及加载到该域中的程序集的位置信息。
向代码授予的权限可以由代码运行所在的应用程序域来控制。
MetaData意思是元数据,也称之为数据的数据。
数据的数据?
一个数据存储在共享卷里时,我们可以直接看到它是一个文档、或图片、或视频、或数据库文件,这些都是数据本身。然而在存储该数据时,文件系统还会产生很多无法直接看到的,与该数据有关的数据,如文件系统中文件检索表,路径信息、地址信息等,而这些数据就称之为文档、图片、视频等在共享卷中的元数据。
SAN网络存储共享软件管理的主要内容就是元数据,控制元数据在多主机之间的传输。
我们可以在很多地方看到元数据的存储,网上DOWN下来的电影本身一个视频文件数据,而点击右键查到看的视频文件属性,如存储路径、码率、文件大小、及导演、演员、制作单位等就是视频文件的元数据。
在地理空间信息中用于描述地理数据集的内容、质量、表示方式、空间参考、管理方式以及数据集的其他特征,它是实 现地理空间信息共享的核心标准之一。