1. 程式人生 > >C#高階程式設計(第7版)讀書筆記(二)

C#高階程式設計(第7版)讀書筆記(二)

 

第二部分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()