Time of Update: 2018-12-07
.NET中特性的索取就是圍繞著ICustomAttributeProvider介面(System.Reflection命名空間內),而MethodInfo類的ReturnTypeCustomAttributes屬性直接返回方法傳回值的ICustomAttributeProvider介面對象。同時MethodBase的ReturnParameter屬性返回方法傳回值資訊(ParameterInfo),而ParameterInfo也是繼承ICustomAttributeProvider的,所以這兩個
Time of Update: 2018-12-07
比如有這樣兩個字串:var a = "a-b=c12";var b =
Time of Update: 2018-12-07
在前一篇文章:.NET(C#):RSA的SignHash和VerifyHash,我講到使用RSA的SignHash和VerifyHash可以同樣做到SignData和VerifyData,事實上還有一種方法進行公開金鑰加密的簽名認證。就是.NET中的AsymmetricSignatureFormatter和AsymmetricSignatureDeformatter。直接翻譯就是“不對稱式加密簽名格式化器和反格式化器”。分明用來進行建立簽名和驗證簽名的。 他們都需要操作一個不對稱式加密類型(即公
Time of Update: 2018-12-07
我們都知道用HashAlgorithm.ComputeHash方法可以計算資料的雜湊值。不過System.Security.Cryptography.HashAlgorithm類是繼承ICryptoTransform介面的,那麼,通過CryptoStream(或者直接操作ICryptoTransform)也是可以計算雜湊值的。 ICryptoTransform的輸入資料就是需要計算雜湊值的來源資料,不過ICryptoTransform的輸出資料和輸入資料是一樣的,真正的雜湊值存在HashAlgo
Time of Update: 2018-12-07
來看一個比較長的數字在.NET下的輸出://+ using System.Globalization;//+ using System.Threading; //把當前線程的CultureInfo改成中文-中國"Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("zh-cn"); decimal m =
Time of Update: 2018-12-07
RSACryptoServiceProvider和DSACryptoServiceProvider的建構函式都可以指定一個CspParameters結構體。利用這個CspParameters結構體我們可以自訂不對稱式加密演算法的密鑰CSP本機存放區名稱(就是密鑰容器:KeyContainer),這個容器預設是儲存在Windows使用者設定檔中的。如果你想把金鑰儲存區在電腦範圍內(而不是使用者範圍),可以用RSACryptoServiceProvider(或者DSACryptoServicePro
Time of Update: 2018-12-07
跟電腦打交道難免經常需要輸出一個位元組數組。這篇文章就講講怎樣輸出一個位元組數組在.NET下的各種方法: 最快捷方法:string BitConverter.ToString(byte[])方法。(有重載支援位元組數組的部分輸出) 代碼:Console.WriteLine(BitConverter.ToString(new byte[] { 1, 3, 54, 123, 199, 200, 215, 255
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
基於雜湊演算法的訊息認證碼(HMAC:Hash-based Message Authentication Code )在.NET也可以很輕鬆地實現。 在目前的.NET Framework中(.NET
Time of Update: 2018-12-07
首先定義Emit動態方法時,DynamicMethod和MethodBuilder的DefineParameter方法不是必須的,因為畢竟構造DynamicMethod或MethodBuilder時你需要指定方法的傳回值類型和參數類型。然後是ILGenerator可以直接用ld_loc(N)或者sd_loc(N)來操作相應的參數就可以了。至於傳回值,直接ret指令就可以。所有如果你沒有特殊需要的話,那麼DefineParameter方法是不需要調用的。 如果想為參數加入名稱,自訂特性,或者其他特
Time of Update: 2018-12-07
訣竅就在CompareOptions.IgnoreWidth枚舉。這個枚舉可以在CompareInfo.Compare方法中用到。而CompareInfo對象可以在CultureInfo的CompareInfo屬性中得到。 代碼://半形(英文)abc78var a = "abc78";//全形的abc78var b = "abc78"; Console.WriteLine(String.Compare(a,
Time of Update: 2018-12-07
AppDomain的Load方法有諸多重載,但是沒有一個等效於LoadFrom(這裡是指Assembly的LoadFrom)。其AssemblyName和string參數都是針對Load(string參數是指程式及名稱的全名而不是路徑)。而byte[]參數相當於LoadFile。 AppDomain.ExecuteAssembly可以傳入檔案路徑,但是從名字上可以看出來這裡只針對可執行檔程式集。(AppDomain還有ExecuteAssemblyByName可以傳入AssemblyName,即
Time of Update: 2018-12-07
C#中ref和out的文章有很多,這篇文章主要從IL上分析out參數的本質。 目錄out = ref + ParameterAttributes.Out 反射調用ref和out方法 Emit構建out或ref參數 返回目錄 out = ref + ParameterAttributes.Out看兩個out和ref的方法。static void test_ref(ref int i){ } static void test_out(out int i){ i = default(int); }
Time of Update: 2018-12-07
比如這樣一個類,我們用XmlArrayItem特性標明數組內出現的元素類型:public class a{ [XmlArrayItem(Type = typeof(int)), XmlArrayItem(Type = typeof(Guid)), XmlArrayItem(Type = typeof(string))] public object[] arr = new object[] { 12, "hehe", Guid.NewGuid() };} 序列化的XML是:<a
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
假設有這麼一個簡單的ConfigurationSection類型(只有一個Id屬性):class MySection : ConfigurationSection{ [ConfigurationProperty("id")] public int Id { get { return (int)this["id"]; } set { this["id"] = value; } } } 那麼你的設定檔只能這樣寫:<configuration&
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
MSDN的這篇文章有點講地不清楚:http://msdn.microsoft.com/en-us/library/s9ts558h.aspx 文中說的字串的COM調用預設封送形式是UnmanagedType.Bstr,而平台叫用的預設封送形式是UnmanagedType.LPTStr。這個LPTStr是和平台相關的,就是WinAPI中的TCHAR定義(98/Me是ANSI,NT/2000/XP/…是Unicode)。然後這一段落就結束了……是的,MSDN上面的這些說的都沒錯,但是它應該提一下平台
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
以GetCursorPos做樣本,它返回當前滑鼠指標在螢幕的位置(以一個POINT結構體)。關於GetCursorPos和POINT的定義可以參考MSDN:http://msdn.microsoft.com/en-us/library/ms648390(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/dd162805(v=vs.85).aspx 首先實現用自訂C#結構體來調用GetCursorPos,一切看著很簡單。定義一個記憶體分別連續