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()
第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()
相关文章推荐
- C#高级编程(第7版)读书笔记
- C#高级编程(第7版)读书笔记(一)
- C#高级编程(第7版)读书笔记(三)
- C#高级编程(第7版)读书笔记(四)
- C#高级编程(第7版) Professional C# 4 and .NET 4 - 读书笔记
- C#高级编程(第7版)笔记--第3章对象与类型
- 《C#高级编程(第7版)》pdf
- 《C#高级编程》读书笔记(十五):任务、线程和同步之四 同步
- 【读书笔记】软件工程·实践者的研究方法第7版 第一部分 软件过程(第3章 敏捷开发)
- C#高级编程(第七版)读书笔记(3)
- 【精通iOS开发(第7版)】读书笔记01(P1~90)
- c#高级编程第六版读书笔记
- 《C#高级编程》读书笔记(十八):网络
- C#高级编程(第七版)读书笔记(4)——对象和类型
- 《C#高级编程》 读书笔记 -索引
- C#高级编程 chapter 4 继承 读书笔记
- 《C#高级编程》中文第七版 读书笔记(目录阐述)
- 《C#高级编程》读书笔记(三):关于泛型
- 【读书笔记】软件工程·实践者的研究方法第7版 第一部分 软件过程(引论 软件和软件工程)
- 【读书笔记】软件工程·实践者的研究方法第7版 第二部分 建模 第4章 指导实践的原则