Time of Update: 2018-12-07
眾所周知XML是可以擴充的,XML的元素可以靠名稱識別而不是只按照未知識別。在XML還原序列化的時候只要需要的資訊存在就可以成功將XML資料轉化成還原序列化後的對象。但是這並不代表著用來還原序列化的XML資料就一定是序列化的標準結果。有些時候XML資料會有多餘冗長資訊,這個在還原序列化的過程中預設是不會被覺察到的。 XmlSerializer類型有三個事件可以覺察到未知XML節點:UnknownNode,UnknownElement和UnknownAttribute。分別對應未知節點,未知元素和
Time of Update: 2018-12-07
這兩個元素都在<configuration> – <runtime> – <assemblyBinding>元素下。 <probing>元素指定CLR探索程式集的子目錄,這個目錄是相對應用程式定義域的基目錄。(可以參考這篇文章:.NET(C#):
Time of Update: 2018-12-07
由於Windows存取控制是可以被繼承的,所以當一個安全性實體從一個位置被移動到另一個位置,他的存取控制是可能因此而被影響的。為了能夠讓一個安全性實體的存取控制保持現有資料而又不會因為路徑改變而繼承目標路徑的控制選項。可以使用ObjectSecurity.SetAccessRuleProtection方法。注意ObjectSecurity類型在System.Security.AccessControl命名空間內,並有ObjectSecurity還有SetAuditRuleProtection方法
Time of Update: 2018-12-07
FormatterService(在System.Runtime.Serialization命名空間內)的GetUninitializedObject方法是.NET還原序列化中CLR初始化對象用到的方法(眾所周知,還原序列化中對象的建構函式是不被調用的)。這個方法我們也可以直接使用來達到相同的效果。 如下代碼:using System;using System.Runtime.Serialization; namespace Mgen{ class a {
Time of Update: 2018-12-07
首先.NET中的ICryptoTransform是單向的,也就是只能從一個狀態將資料轉化成另一個狀態,反之是不可以的。當然手動操作ICryptoTransform還是比較繁瑣的,通過CryptoStream可以更輕鬆地操作一個ICryptoTransform。由於ICryptoTransform是單向的,所以加密解密這兩個過程就需要兩個ICryptoTransform,這個通過SymmetricAlgorithm類的CreateEncryptor和CreateDecryptor方法來建立。而用C
Time of Update: 2018-12-07
CryptoStream的成員方法確實有些混亂,細細研究一下,其實也不是特別混亂,也算符合.NET中的某些命名規則吧。先說Flush相關的,感覺這個更重要些。 首先從Stream類繼承來的Flush方法並沒有執行流的Flush操作,CryptoStream改寫基類的Flush方法為空白: 而CryptoStream自己的FlushFinalBlock才進行所謂的Flush操作(難道微軟想用這種方式提醒開發人員CryptoStream的Flush操作很重要嗎?),這個操作會將內部緩衝區的資料進行寫
Time of Update: 2018-12-07
目錄Emit異常處理流程 顯示Exception對象的Message屬性 返回目錄 Emit異常處理流程來看這種C#異常處理代碼:static void doo(Exception e){ try { throw e; } catch (ApplicationException ex) { Console.WriteLine("捕獲ApplicationException"); } catch {
Time of Update: 2018-12-07
首先如果您看下面代碼有些費解的話,推薦先閱讀以下MSDN上關於平台叫用的指定字元集文章:http://msdn.microsoft.com/zh-cn/library/7b93s42f.aspx 學習.NET(C#)的平台叫用和對象封送,你會發現其實同樣的系統API函數的平台叫用定義可以有多種形式的,本文就拿WinAPI的MessageBox開涮。首先通過DllImportAttribute.CharSet來自動指定名稱探索(根據DllImportAttribute.ExactSpelling)
Time of Update: 2018-12-07
System.Diagnostics.Switch類的Value和SwitchSettings屬性是protected修飾符,並且是可以設定的。Value是字串類型,SwitchSetting是int類型。Switch類的值是Value屬性,當值被設定後,Switch會嘗試將Value字串轉換成SwitchSetting的數字。如果無法成功轉換,異常將會被拋出。 當自訂Switch類時,可以改寫OnValueChanged和OnSwitchSettingChanged方法來自訂Value屬性和S
Time of Update: 2018-12-07
注意:以Trace類做樣本,但Debug類也通用。 Trace.Listeners預設是一個System.Diagnostics.DefaultTraceListener類型,這個類型的接聽程式會在斷言時彈出一個對話方塊,如下代碼://+ using System.Diagnostics;Trace.Assert(false,
Time of Update: 2018-12-07
研究一下正則RegexOptions枚舉的三個針對匹配行的區別,對應None,SingleLine(單行)和Multiline(多行)枚舉值。 結論是:None:(.)匹配任何字元除了\n。^和$不起作用。 Singleline:(.)匹配任何字元。^和$匹配整個字串 Multiline:(.)匹配任何字元除了\n。^和$匹配每行的開頭和結尾。 另外貌似目前.NET的正則對\A和\Z支援的不是很好。下面測試代碼:(注意由於輸出字元中有分行符號,因此用ASCII碼作輸出)//+ using
Time of Update: 2018-12-07
當不使用SMTP的25連接埠號碼發送郵件,某些低許可權執行環境可以會拋出異常,最好還是在執行操作前進行許可權的檢查。 SMTP在.NET中對應的許可權是:SmtpPermission類型(還有聲明式的SmtpPermissionAttribute特性,他們都在System.Net.Mail命名空間下)。他的Access屬性控制許可權的內容。對應一個SmtpAccess枚舉。有3個值:None(沒有),Connect(串連預設連接埠25),ConnectToUnrestrictedPort(串連任
Time of Update: 2018-12-07
如果你對Windows存取控制不瞭解的話,建議先看這篇文章: 淺談Windows存取控制在.NET(C#)中的實現(ACE, SD, DACL, SACL) 我們知道在系統存取控制清單(SACL)中,ACE是審核規則,.NET中System.Security.AccessControl命名空間內封裝了審核規則(Audit
Time of Update: 2018-12-07
目錄1. 單個程式集配置重新導向2. 發行者策略程式集3. 開發測試中頻繁版本更新 返回目錄1. 單個程式集配置重新導向當單個依賴程式集,比如A,依賴程式集B,比如使用B的1.0版本。現在B從1.0升級到了2.0。那麼此時可以在程式集A中手動重新導向B的版本,這樣在程式集A運行後會自動使用更新的2.0版本的程式集B。 程式集的版本重新導向須寫在程式集自己的設定檔中(App.config)。在<configuration> – <runtime> –
Time of Update: 2018-12-07
我們知道,AppDomain.ProcessExit能監視當前進程的退出,而Process.Exited事件只能監視其他進程的退出。而且如果進程被強制結束AppDomain.ProcessExit不會發生的。綜上事實,我們可以用兩個進程互相監視另一個進程的Process.Exited事件來,然後如果一個進程被結束,另一個進程會重新開啟這個程式。 比如樣本中兩個程式,mgen_p1,和mgen_p2。一個程式結束後,另一個程式會馬上重新運行被結束的程式。當然如果兩個程式同時被結束,那麼他們會被徹底
Time of Update: 2018-12-07
HTTP請求包頭資訊中有一個Range屬性可以指定索取部分HTTP請求的檔案。在.NET中則通過HttpWebRequest.AddRange方法來定義資料的範圍。當添加了Range屬性的HTTP請求發送後,如果伺服器支援該請求,也就是說支援部分資料提取(也是我們常說到的支援斷點續傳的下載,所謂斷點續傳的下載就是用一個Range屬性來指定沒有下載到的範圍),那麼伺服器會返回Partial Content狀態值。否則會返回OK狀態值(200代碼)。注意如果伺服器支援Range但是HTTP
Time of Update: 2018-12-07
和for/foreach中發生異常的表現一樣,Parallel迴圈中的任何異常都會使整個迴圈終止,注意由於整個迴圈是分塊同時進行的,因此整個迴圈不會立即終止(如果有一個線程進行中長時間工作的話,而且是發生在CancellationToken的ThrowIfCancellationRequested方法之後)。 代碼:try{ Parallel.For(0, 5, (i) => { throw new Exception("異常。迭代數字:" + i); })
Time of Update: 2018-12-07
首先當Break被調用後,迴圈中當前調用Break的執行後的迭代就沒有必要去執行了,由於並存執行打亂了執行順序,所以這個時候很可能某些不需要執行的迭代已經執行完了,這個沒辦法(也沒必要)去取消它,當然調用Break後沒有必要執行且沒有開始執行的迭代最終不會被執行。 上面只討論了“已經執行完”和“沒有執行的狀況”,對於正在執行的卻沒有必要執行的迭代,同樣沒辦法將他停止,此時ParallelLoopState.LowestBreakIteration(類型是long?,預設是null)則會成為最小的
Time of Update: 2018-12-07
更新:在C# 5.0後,await所產生的取消Task異常會直街拋出異常。比如下面的代碼,在C# 5.0/.NET 4.5中等效於:var src = new CancellationTokenSource();src.CancelAfter(100);try{ await Task.Factory.StartNew(() => { Thread.Sleep(1000); src.Token.ThrowIfCancellationRequested(
Time of Update: 2018-12-07
這個特性太碉堡了,很像WPF中的資料繫結,當然本質就是Visual Studio在調試時利用反射擷取對象的值。 建構函式中的屬性值(就是{}中的內容)不僅僅可以是簡單的屬性值。還可以是索引器,而且這一切可以嵌套。(DebuggerDisplay特性(DebuggerDisplayAttribute類型)在System.Diagnostics命名空間內) 來定義一個有DebuggerDisplay的類: