發表文章

目前顯示的是有「C#」標籤的文章

Could not load file or assembly 'System.Buffers' 無法載入檔案或組件....

最近遇到C# windows form 的老專案必須使用 smtpclient寄信,但因為MailServer限制使用starttls與587port寄信,使用原來net 的 smtpclient 不能支援此方法,所以必須改用Mailkit組件。 由於原來專案使用.net  Framework 4.5.x版本過舊,咬牙升級為 .net Framework 4.7.1。 Mailkit看似搞定,但在建置過程中卻會看到警訊,   Could not load file or assembly 'System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The located assembly 's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 此問題的發生原因是Mailkit需要較新版本的System.Buffers等組件dll,透過nuget更新版本後,專案仍然記載要去拿原來的dll。 解決方法如下 <1>重新註冊元件 透過系統VisualStudio選單底下的開發人員終端機介面(要使用系統管理員權限執行),進到專案packages目錄之下擺放特定組件的位置,重新註冊元件。 教學文內的目錄是 netstandard2.0,傳統.net framework要選.net framework的版本 cd d:/project_folder/packages/System.Buffers.4.5.1/lib/ netstandard2.0 / 然後執行 gacutil /i System.Buffers.dll 接著回到Visual Studio內的Nuget 套件管理員( package manager console),透過powershell重新安裝套件。 update-package -reinstall 用文字模式打開   csproj 檔案,確認引用組件的版本改為4.0.3.0 (Version=4....

itextSharp繪製表單使用攻略(如何美化)

筆者從2011年開始接觸itextsharp這個從java轉到c#的套件,累積了一些心得與大家分享。 一、itextSharp 的物件概念很徹底,從文件本體的 doc 出發,最小單元的phrase(詞彙),到paragraph(段落),乃至於table,都是以組件的方式新增到doc之中。因為用法很靈活,初學者很常會搞不清楚而寫出冗長的程式碼。 例如畫出一個表格,語法大概像下面這樣,先指定有幾欄、帶入每欄寬度、表格的寬度,以及欄位的padding預設值。可以用預設值方式設定格子的留白(padding),看起來較專業。若是padding沒設,字會跟儲存格黏再一起,感覺就像是工程師畫的 XD float[] tbPreReqColWidth = { 250f, 250f, 250f, 250f }; PdfPTable tbCredit = new PdfPTable(4); tbCredit.SetWidths(tbPreReqColWidth); tbCredit.WidthPercentage = 95; //寬度 tbCredit.DefaultCell.Padding = 7; 若是宣告好 paragraph,直接用addcell方法塞進表格而產生cell的,會自動套用 DefaultCell的屬性值,如: tbCredit.AddCell(thisTeach2); 若是這是個需要獨立個別屬性的儲存格,就不受到tbCredit.DefaultCell底下屬性的影響,必須都自己來。 Paragraph BriefTitle = new Paragraph("一、教師姓名:" + query1.NAME_CH.Trim() + "\n", largeFontBold); BriefTitle.Alignment = Element.ALIGN_LEFT; PdfPCell cellTitle = new PdfPCell(BriefTitle); cellTitle.Colspan = 4; cellTitle.PaddingBottom = 7; cellTitle.BackgroundColor = new BaseColor(System.Drawing.Color.LightGra...

在EF中執行SQL查詢 (Execute Raw SQL Queries in Entity Framework)

EF(Entity Framework)是微軟提供的佛心ORM工具,讓菜鳥開發人員得以在操作後端資料庫時,可以在Visual Studio中以物件的方式選擇資料庫內的表格與欄位,減少手動組合SQL指令發生的錯誤。但若資料庫因正規劃切割成數十個表格,或者主索引鍵規劃不良、有許多子查詢時,檢查EF組合出的SQL語法,其時間成本可能遠遠超過原來所預期。 遇到這種情形,筆者可能會選擇設計View、資料表函數或者預存程序,在EF內加入此物件。但要記得回傳的查詢結果必須要有Key值。 另一種情形是開發者無法(或沒有權限)在DB上新增物件。可能的方案是直接在EF下 SQL語法。從舊有的程式翻修時,會遇到有複雜join的情形,靠EF Mapping可能會有錯。這時候可以手動帶參數進去。 using ( var ctx = new SchoolDBEntities ()) { var student = ctx.Students .SqlQuery( "Select * from Students where StudentId=@id" , new SqlParameter("@id", 1)) .FirstOrDefault(); } 但這樣的sql如果選取的欄位名稱與EF內的物件名稱衝突,還是會產生Exception。

c# 列出所有類別中的屬性 ( Iterate through all class fields in C#)

I have  one  example  class like this: public class Foo{  public string Idno { get; set; }  public string Phone{ get; set; } public string Department{ get; set; } }  In order to bind database's  columns like EF,  I would like to iterate through these fields  dynamically ,  using System.Reflection;     Foo  foo = new  Foo ();             foo. Idno  = "a12345678";             foo. Department  = "IT";             foreach (PropertyInfo prop in typeof( Foo ).GetProperties())             {                 Response.Write(prop.Name + ";" + prop.GetValue(foo, null));             }