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()