您的位置:首页 > 编程语言 > C#

C#高级编程(第7版)读书笔记(二)

2012-03-07 15:06 309 查看
第二部分Visual Studio

第16章VS2010

Vs2010有WPF,MEF,WCF,WF,AJAX

条件断点

Debug-Exceptions菜单设置异常时操作

第17章部署

第三部分基础

第18章程序集

程序集由描述它的程序集元数据、描述导出类型和方法的类型元数据、IL代码和资源组成。

程序集清单是元数据的一部分。

共享程序集必须有一个唯一的名称(强名)。

模块和程序集:模块可添加到程序集。

动态加载和编译:Assembly.Load,

Microsoft.CSharp.CSharpCodeProvider.CompileAssemblyFromSource()

应用程序域:

AppDomain.CreateDomain(“name”).ExecuteAssembly(“assembly.exe”)/.CreateInstance()

卸载程序集只能通过终止应用程序域来进行AppDomain.Unload(“name”);

只有继承自MarshalByRefObject的类才可以在另一个应用程序域访问。

共享程序集:强名组成(程序集名称,版本号,公钥,区域性),Authenticode签名建立信任关系

Gacutil.exe

Sn.exe

Vs的signing选项

延迟签名:/delaysign+或signing选项

Ngen.exe本机代码生成器

配置.net应用程序:.config文件,发行者策略文件

codeBase用于共享程序集,probing用于私有和共享程序集;

更新版本bindingRedirect,oldVersion,newVersion

发行者策略文件:xml文件,链接器al /linkresource:name.config /out:policy.1.0.DllName.dll /keyfile name.snk,然后用gacutil把策略程序集加入gac

可通过publisherPolicy apply=no禁用发行者策略。

第19章检测

19.1代码协定

System.Diagnostics.Contracts

定义方法中的前提条件,后置条件,常量。

方法的开头定义:Contract.Requires(),Contract.Ensures();

Contract.ForAll(),Contract.Result<T>(),Contract.OldValue<T>()

Contract.Invariant()

接口协定:[ContractClass(typeof(ClassName))]

[ContractClassFor(typeof(IName))]

[Pure]

19.2跟踪

TraceSource,SourceSwitch,SourceLevels

<system.diagnostics>

<sources><source name= switchname= switchtype= /></sources>

<switches><add name= value= /></swithes>

TraceListener:<source><listeners><add name= type= tracesOutOptions= initializeData= >

<filter type= initializeData= /></add>

<sharedListeners>定义共享侦听器

svctraceviewer.exe

19.3事件日志

EventLog.CreateEventSource(new EventSourceCreationData())

WriteEntry(),WriteEvent()

消息编译器mc.exe

Rc.exe创建资源文件

19.4性能监控

PerformanceCounter

第20章线程、任务和同步

20.1概述

20.2异步委托

IAsyncResult,BeginInvoke,EndInvoke

WaitHandler.WaitOne()

异步操作:HttpWebReques.BeginGetResponse,SqlCommand.BeginExecuteReader

20.3Thread类

New Thread(Func)

带数据线程:实例方法,或带参数委托初始化

Thread创建的是前台线程,线程池中的是后台线程;IsBackground可设置

Priority

ThreadState:start后不是running,调度器选择后才是running

Sleep():WaitSleepJoin状态

Join():停止当前线程,WaitSleepJoin状态

20.4线程池

ThreadPool

GetMaxThreads()获得最大线程数

QueueUserWorkItem(WaitCallback)

限制:不能更改线程池中线程为前台线程,不能更改优先级,COM对象是多线程单元线程,只能用于短时间任务。

20.5任务

System.Threading.Tasks

new TaskFactory().StartNew(Action),Task.Factory.StartNew(Action),new Task(Action).Start()

TaskCreationOptions枚举

连续任务t.ContinueWith(Action)

任务层次结构:父任务子任务

任务返回结果new Task<TResult>(Func,obj)

20.6Parallel类

For(),ForEach(),Invoke()

For(from,to,Action<int>)

For<Tlocal>()

ForEach<string>(IEnumerable,Action<string>)

20.7取消架构

CancellationTokenSource().Token.Register(Action)

.Cancel(bool)

20.8线程问题

竞态条件:加锁

死锁:

20.9同步

Lock和线程安全

SyncRoot模式:锁定私有object字段

Interlocked类:CompareExchange<T>,Increment()

Monitor类:lock解析为此类,Enter(obj),Exit(obj),TryEnter()

SpinLock结构

WaitHandler基类:Mutex,EventWaitHandler,Semaphore子类

Mutex类:互斥,可用来设置应用程序只能启动一次。

Semaphore类:信号量

Events类:

Barrier类:

ReaderWriterLockSlim类:

20.10Timer类

20.11基于事件的异步模式

BackgroundWorker类:RunWorkAsync,DoWork,ProgressChange,

CancelSync,RunWorkerCompleted,ReportPrograss

第21章安全性

21.1身份验证和授权

1标识和Principal

System.Security.Principal

IIndentity:WindowsIndentity,AuthenticationType,IsAuthenticated,Name

IPrincipal:包含标识和所属角色,Indentity,IsInRole(),WindowsPrincipal,GenericPrincipal

SetPrincipalPolicy():设置当前线程主体标识

2角色

3基于角色的安全性

[PrincipalPermissional]

4客户端应用程序服务

System.Web.Security

Membership,Roles

MembershipProvider:ActiveDirectory,Sql,

ClientFormsAuthentication,ClientWindowsAuthentication

MembershipProvider.ValidateUser(),RoleProvider.GetRolesForUser(),IsUserInRole()

服务端webservice

<system.web.extensions>

<scripting>

<webServices>

<authenticationService enabled=”true” requireSSL=”false” />

<roleService enabled=”true” />

</webServices>

<system.web>

<membership></>

<roleManager></>

客户端

项目设置Services,指向webservice地址和端口

引用System.Web,System.Web.Extensions

修改配置文件ClientMembershipProvider,RoleProvider的ServiceUri

Membership.ValidateUser()静态方法进行登录验证

21.2加密

签名

System.Security.Cryptography

CngKey cryKey=CngKey.Create(Cngalgorithm.ECDsaP256);

byte[] blob=cryKey.Export(CngKeyBlobFormat.GenericPublicBlob);

byte[] data=Encoding.UTF8.GetBytes(“”);

byte[] cryData=new ECDsaCng(cryKey).SignData(data);

bool decrySuccess=new

ECDsaCng(CngKey.Import(blob, CngKeyBlobFormat.GenericPublicBlob).VerifyData(data,cryData);

交换密钥和安全传输

byte[] keyByte =

new ECdiffieHellmanCng(privateKey).DeriveKeyMaterial(CngKey.Import(pubKeyBlob,enum));

ICryptoTransform crypto =

new AesCryptoServiceProvider(){Key= keyByte,IV=byte[]}.CreateEn/Decryptor()

var cs = new CryptoStrem(new MemeryStream(),crypto ,CryptoStreamMode.Write)

cs.Write()

21.3资源的访问控制

ACL访问控制列表

System.Security.AccessControl

FileStream().GetAccessControl().GetAccessRoles()

File.SetAccessControl(filename,FileSecurity().SetAccessRole())

21.4代码访问安全性

第2级安全透明性

[assembly:SecurityRules(SecurityRuleSet.Level2)]

SecurityTransparent()

AllowPartiallytrustedCallers()

默认SecurityCritical()

权限:

权限集FullTrust,SkipVerification,Execution,Nothing,LocalIntranet,Internet,Everything

AppDomain.CreateDomain时可设置权限集。

21.5使用证书发布代码

创建测试证书及密钥:makecert

创建软件发布者测试证书:cert2spc

创建pfx证书:pvk2fpx

标记程序集:signtool.exe sign –f name.pfx –v app.exe

第22章本地化

22.1System.Globalization名称空间

1Unicode问题

基本字符,组合字符,显式问题

2区域性和区域

CultureInfo

RegionInfo

CurrentCulture,CurrentUICulture

3使用区域性

4排序

22.2资源

资源文件生成器Resgen.exe

/str:强类型化资源

ResXGen.exe

ResourceWriter类:二进制资源

ResXResourceWriter类:xml资源

rw.AddResource()

22.3WinForm本地化

Localizable设为true自动增加.resx文件,自动添加管理类。

22.4Asp.net本地化

<system.web><globalization culture= >

22.5WPF本地化

22.6自定义资源读取器

第23章System.Transaticons事务

23.1概述

ACID原子性,一致性,隔离性,持久性

23.2数据库和实体类

23.3传统的事务

Ado.net事务SqlTransaction,不是分布式事务:

tx = conn.BeginTransaction();

cmd.Transacton=tx;

tx.Commit();tx.Rollback();

System.EnterpriseServices事务:

需要COM+主机模型,类必须派生自ServicedComponent

[Transaction]标记类,[AutoComplete]标记方法

23.4System.Transactions

CommittableTransaction唯一支持提交的事务类,Commit()

DependentTransaction,SubordinateTransaction

可提交的事务:

conn.EnlistTransaction(tx)连接关联事务

事务的升级:分布式事务(关联到多个连接)

升级需启动分布式事务协调器DTC

依赖事务:

tx.DependentClone(),Complete()

环境事务:

不需要手动连接登记事务

Transaction.Current,TransactionScope,Complete(),Dispose()

嵌套TransactionScopeOption.Require|RequireNew|Suppress

多线程:同一个环境事务需要使用依赖事务

23.5隔离级别

IsolationLevel,TransactionOptions

23.6自定义资源管理器

IEnlistmentNotifacation,Prepare,Indoubt,Commit,Rollback

事务资源:Transactional<T>

23.7Windows7和Windows2008的事务

支持文件和注册表本地事务

通过句柄把事务作为变量传递,不支持环境事务

第24章网络

24.1WebClient类

client.DownloadFile(Url,filename)

Stream sm = client.OpenRead(Url)

client.OpenWrite(Url,”Posttype”)

UploadFile(),UploadData()

24.2WebRequest类和WebResponse类

WebRequest.Create(Url).GetResponse().GetResponseStream()

WebRequest:Timeout,Credentials,Proxy

WebResponse:Headers

异步页面请求:BeginGetResponse(),EndGetResponse()

24.3把输出结果显示为HTML页面

System.Diagnostics.Process:打开ie

WebBrowser控件:Navigate(Url)

LinkLabel控件事件中,new WebBrowser().Navigate(Url,true)单独窗口启动ie

WebBrowser的Navigated事件

DocumentTitle,Url属性

事件和方法可进行前进后退刷新停止启用禁用等

打印:Print()

显示页面代码:DocumentText属性,DocumentStream

24.4实用工具类

Uri,UriBuilder:Host,Port,Scheme,Query

IPAddress,IPHostEntry,Dns[Resolve,GetHostByAddress静态方法]

24.5较低层的协议

System.Net.Sockets

Socket,NetworkStream,SmtpClient,TcpCliient,UdpClient,TcpListener

SmtpClient,MailMessage类,send(),Sender,To,Attachments属性

TcpClient,TcpListener:GetSteam()后Write()写数据;后天线程new Thread,TcpListener().Start()

UDP:功能简单,可靠性要求高,如视频流;send(),receive()

Socket类:bind(),listen(),accept(),connect(),receive(),send()

GetSocketOption()/Set

第25章Windows服务

25.1Windows服务

25.2Windows服务的体系结构

服务程序,服务控制程序(mmc或其他),服务配置程序(安装服务)

服务程序:主函数,service-main函数,处理程序

可提供多个服务,包含多个service-main,service-main必须在服务控制管理器注册

服务必须在注册表中配置

ServiceBase,ServiceController,Service[Process]Installer类

25.3创建Windows服务程序

服务启动不能时间太长,太长会失败,需要多线程或线程池。

OnStart(),OnStop()等

安装:ProjectInstaller类,和两个实例类ServiceInstall,ServiceProcessInstaller

[RunInstaller(true)]标记类,安装时或用Installutil.exe会调用

ServiceProcessInstaller类属性:Account,UserName,Password,HelpText

ServiceInstaller属性:StartType,DisplayName,ServiceName,ServicesDependentOn

ServiceInstallDialog类:安装时可输入信息

25.4服务的监视和控制

Net.exe,sc.exe

net satart/stop servicename,net pause

自定义ServiceController类

25.5故障排除和事件日志

可在创建服务之前创建应用程序测试程序集

AutoLog

第26章互操作性

System.DirectoryService

System.Data.OleDb

26.1COM和.Net

.Net使用不带类型库的COM,必须重新定义COM接口

COM必须实现IUnknown,通过IUnknown引用计数释放内存,QueryInterface,AddRef,Release

接口是COM的核心,自定义接口、调度接口dispatch和双重接口

自定义接口定义了虚拟表中方法的顺序,方法绑定使用内存地址进行。脚本客户端不能使用自定义接口。

IDispatch接口增加4个方法。

双重接口,对脚本客户端和其他客户端提供两种使用方式。

QueryInterface可进行类型转换。

COM是全局的。

CLSID,IID,typelibid

COM事件:IConnectionPointContainer,IConnectionPoint,ICompletedEvents(输出接口,需客户端实现);客户端通过FindConnectionPoint(),Advise()传给服务器。

26.2编组

COM和.Net通信数据转换为相应的表示法,成为编组。

blittable不需转换,nonblittable需要转换

SAFEARRAY:Array,VARIANT:Object,BSTR:String,IUnknown* IDispatch*:Object

26.3从.net客户端中使用COM组件

.net创建RCW,通过命令行tlbimp或vs(引用COM,EmbedInteropTypes设为true主程序集中会创建包装器类,false创建单独交互操作程序集)

创建带有包装器类的.net程序集。

使用:Runtime .InteropServices.Marshal类可释放COM对象。

象.net类一样实例化,可强制转换为其他接口。

Marshal.ReleaseCOMObject

使用动态语言dynamic不创建RCW也可以使用COM:

dynamic c=Activator.CreateInstance(Type.GetTypeFromProgID(“ComName”));

可像.net一样使用COM事件。

26.4从COM客户端使用.net组件

CCW包装

.net创建组件:

新建类库工程,接口和组件类使用[ComVisible(true)]标记;

可使用GUID,ProgId,InterfaceType,Dispid,In,Out,Optional等标记类、接口、方法;

创建事件需添加连接点,添加INameEvents接口,标记为调度接口,类中必须标记源接口,类为源接口的每个方法声明事件,事件名为方法名,方法类型是委托名。

创建类型库,tlbexp name.dll;

Regasm.exe name.dll /tlb注册表

Gacutil.exe全局程序集缓存

26.5平台调用

Dumpbin.exe /exports *.dll |more查看非托管函数

[DllImport(“”,,,,)

[retrun:MarshalAs(UnmanagedType.Bool)]

public static extern Method()

IntPtr结构和SafeHandler安全句柄。

第27章核心XAML

eXtensible Application Markup Language可扩展应用程序标记语言

WPF,Silverlight

27.1概述

使用自定义类,使用命名空间别名:xmlns:name=”clr-namespace:Namespace”

[assembly:XmlnsDefinition(“”,””)]

<sys:>

泛型x:TypeArguments

构造函数x:Arguments

27.2依赖属性

DependencyProperty为静态成员,属性名加Property表示;DependencyProerty.Register()

ProperMetaData强制值回调,值变更回调

事件的冒泡和隧道:类派生自UIElement

27.3附件属性

DependencyProerty.RegisterAttached()

27.4标记扩展

<Window.Resources>

{StaticResource }

<StaticeResourceExtension >

27.5创建自定义标记扩展

基类MarkupExtension,override ProviderValue(IServiceProvider)

27.6XAML定义的标记扩展

27.7读写XAML

XamlService.Load()

XamlReader.Load()

第28章managed extensibility framework

创建插件模型,查找和使用插件;宿主应用程序

System.ComponentModel.Composition

28.1MEF的体系结构

编写动态加载插件的应用程序技术:MEF,MAF(Add-in)

通过部件和容器构建

MEF包括三大类别:永远宿主的类,基元类,基于特性机制的类

定义合同接口程序集;

定义实现合同接口的插件部件程序集,用[Export(typeof(InterfaceName))]标记导出为部件类;

宿主用[Import]标记可用插件的成员。

var catalog=new DirectoryCatalog(Settings.Default.AddInDirectory);

var container=new CompositionContainer(catalog);

container.ComposeParts(this);

28.2协定

字符串协定

[Export(“namespace”)]

[Import(“namespace”)]

28.3导出

导出类型

也可导出属性和方法

[Export(“MethodName”,typeof(Func<type..>))]

[Import(“MethodName”,typeof(Func<type..>))]

public Func<type..> MethodName {get;set;}

导出元数据

[Export(“MethodName”,typeof(Func<type..>))]

[ExportMetadata(“key”,”value”)]

[ImportMany(“MethodName”,typeof(Func))]

public Lazy<Func<T..>,IDictionary<string,object>>[] MethodName {get;set;}

可自定义包含元数据ExportAttribute

28.4导入

[ImprtMany(AllowRecompositon=true)]允许运行时动态映射新出口

类实现IPartImportsSatisfiedNotification.OnImportsSatisfied()导入成功是调用

懒惰加载Lazy<T>

28.5容器和出口提供程序

CompositionContainer().ComposeParts()加载部件

Compose(CompositionBatch())

CompositionBatch().AddPart(import实例)

28.6类别

DirectoryCatalog目录,可变

AssemblyCatalog引用程序集,不变

TypeCatalog

AggregateCatalog类别的类别

第29章文件和注册表操作

System.IO,System.Win32

29.1管理文件系统

System.MarshalByRefObject类,远程操作基类

System.IO.FileSystemInfo,File[Info],Directory[Info],Path,DriverInfo

1文件和文件夹类File,Directory

2Path类:Path.Combine()

29.2移动复制和删除文件

Move,Copy,Delete

29.3读写文件

File.ReadAllText()/ReadAllBytes()/ReadAllLines()

File.Write……

流Stream,TextReader,TextWriter

常用FileStream,StreamReader,StreamWriter

new FileStream(“filename”,FileMode.Create|..[,FileAccess[,FileShare]])

FileInfo().Open()/OpenRead()/OpenWrite/Create

FileStream().Read(ByteArray,index,length)/ReadByte()|Write(ByteArray,index,length)/WriteByte(byte)

读写文本文件用StreamReader/Writer

可通过字符串或FileStream实例进行构造

也可通过FileInfo().ReadText()|CreateText()实例化

29.4映射内存的文件

System.IO.MemoryMappedFiles名称空间

可用作多个进程的共享资源

MemoryMappedFile.CreateFromFile(“”,…).CreateViewAccessor().WriteArray<byte>(..)

ReadArray<byte(..)

29.5读取驱动器信息

DriveInfo

DriveInfo.GetDrives()

29.6文件的安全性

System.Security.AccessControl名称空间

FileSecurity fSec=new FileStream()|new DirectoryInfo().GetAccessControl();

FileSystemAccessRule[] fsar=fSec.GetAccessRules(bool,bool,typeof(Account));

Fsar[i].FileSystemRight/IdentityReference/AccessControlType;

fSec.AddAccessRule(new FileSystemAccessRule(…));|RemoveAccessRule();

File.SetAccessControl(“filePath”,fSec);

29.7读写注册表

添加到添加/删除程序中需使用注册表

Registry/RegistryKey类

29.7.1注册表结构

regedit

应用程序键一般在Local_Machine中

29.7.2.net注册表类

Microsoft.Win32.Registry/RegistryKey

RegistryKey key=Registry.LocalMachine.OpenSubKey(“”).OpenSubKey(“”,true[可写])..

CreateSubKey(“”),Delete()

SetValue(),GetValue()

29.8读写独立存储器

ReadSettings(),SaveSettings()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: