Feeds:
文章
迴響

Archive for the ‘C#’ Category

ILSpy + Reflexil 修改 Class Property

話說有個C#寫的工具想修改一下. 已經找到修改點, 可是卻發現

20160121-1

屬性沒有反組譯成 IL orz

後來發現把語言切成 IL 才會出現, 這是 Bug 嗎

20160121-2

改了才注意到 C# 的 bool 轉成 IL 是 int32

return true

翻譯後就是

ldc.i4.1

ret

而 return false

翻譯後就是

ldc.i4.0

ret

此時我要的功能已經改完 XD… 繼續工作

 

 

Read Full Post »

(C#) 圖檔轉 HTML

之前那篇"原來 HTML 產生圖形是有工具 @﹍@",提到一種轉換方式,也提供 perl 的原始碼,今天我利用 C# 重寫一遍….
也移除 width * height 必須小於 10000 pixel 限制。不過,圖檔尺寸太大,最後產出的檔案也相當驚人,執行也會耗去大量記憶體

雖然,這個程式在產生 HTML 時,還有使用 Run Length Coding 概念,將同一種顏色透過 <table> 的 colspan 來減少 tag 的輸出…
不過,還是請小心使用..

主程式下載

執行結果[下載]
Snap1

Read Full Post »

[C#]Array 和 ArrayList 之間互轉

1. Array 轉 ArrayList
    1.1 使用 ArrayList 的建構子,其中一個可接受實作 ICollection 介面的物件
    1.2 使用 ArrayList 的靜態方法 Adapter,此方法可接收實作 IList 介面的物件
 
2. ArrayList 轉 Array
   2.1 使用 ToArray 方法
 
範例:
    class Program {
        static void Main(string[] args) {
            // Array To ArrayList           
            string[] names = new string[]{
                "Arick"
                ,"Mavis"
                ,"Ada"
                ,"Jeff"
            };
            // Method #1
            ArrayList al = new ArrayList(names);
            DumpList(al);
           
            // Method #2
            al = ArrayList.Adapter(names);
            DumpList(al);
            // ArrayList To Array
            string[] ss = (string[])al.ToArray(typeof(string));
            foreach (string  s in ss) {
                Console.WriteLine(s);
            }
        }
        private static void DumpList(ArrayList al) {
            foreach (object o in al) {
                Console.WriteLine(o as string);
            }
        }
}

Read Full Post »

[C#]一個監聽 http:// 伺服器的範例

using System;
using System.Net;
using System.Threading;
using System.IO;
namespace ConsoleApplication1 {
    public class ArickServer {
        private HttpListener listener = null;
        public ArickServer() {
            // 1. 建立 http 監聽
            listener = new HttpListener();
            // 2. 處理的統一資源識別元 (URI) 前置詞
            listener.Prefixes.Add("http://+:5678/");
            // 3. 啟動伺服器
            listener.Start();
            Console.WriteLine("Start…"); 
            while (true) {
                // 4. 等待接收使用者需求
                HttpListenerContext context = listener.GetContext();
                // 5. 分派一個 Thread 處理使用者需求
                ThreadPool.QueueUserWorkItem(new WaitCallback(OnGetContext), context);
            }
        }
        // 處理使用者需求
        public void OnGetContext(object objContext) {
            try {
                HttpListenerContext context = objContext as HttpListenerContext;
                if (objContext != null) {
                    // 設定回應的內容型態
                    context.Response.ContentType = "text/html";
                    // 寫入回應資料
                    StreamWriter writer = new StreamWriter(context.Response.OutputStream);
                    writer.WriteLine("<html><body><pre>");
                    writer.WriteLine("Method:" + context.Request.HttpMethod.ToString());
                    if (context.Request.HttpMethod == "POST") {
                        StreamReader sr = new StreamReader(context.Request.InputStream);
                        writer.WriteLine("Parameter:" + sr.ReadToEnd());
                        sr.Close();
                    } else {
                        writer.WriteLine("Parameter:" + context.Request.Url.Query);
                    }
                    writer.WriteLine("</pre></body></html>");
                    writer.Flush();
                    context.Response.Close();
                }
            } catch (System.Net.HttpListenerException hlEx) {
                Console.WriteLine( string.Format("{0}rn{1}", hlEx.Message, hlEx.StackTrace) );
            }
        }
    }
    class Program {       
        static void Main(string[] args) {
            ArickServer s = new ArickServer();
        }
    }
}

Read Full Post »

如何產生 guild 字串

全域唯一識別碼 (GUID)是一個 128-bit 組成的整數,也就是2的128 次方,使用通過亂數產生標準的亂數演算法產生 2的128 次方 其中之一的整數。
 
在 .Net Framework 中可以使用 Guid.NewGuid() 取得。

Read Full Post »

輕鬆建立執行緒

在 .Net 中建立執行緒(thread)真的是異常的簡單,不用呼叫像 CreateThread 或 _beginthreadex 之類的函數,只需要透過 Thread 類別即可輕鬆建立執行緒,簡單的範例如下:
 
using System;
using System.Threading;
namespace threadTest
{
 class CTest
 {
  [STAThread]
  static void Main(string[] args)
  {
   // 靜態方法
   Thread thread1 = new Thread ( new ThreadStart(CTest.func1));
   thread1.Start();
 
   // 物件方法
   CTest obj = new CTest();
   Thread thread2 = new Thread (new ThreadStart(obj.func2));
   thread2.Start();
  }
  
  static void func1(){
   Int64 i = Int64.MinValue ;
   while(true){
    ++i;
    Console.WriteLine("func1(): " + i.ToString() ) ;
    if (i>=Int64.MaxValue ){
     i = Int64.MinValue ;
    }
   }
  }
  void func2(){
   Int64 i = Int64.MinValue ;
   while(true){
    ++i;
    Console.WriteLine("func2(): " + i.ToString() ) ;
    if (i>=Int64.MaxValue ){
     i = Int64.MinValue ;
    }
   }
  }
 }
}
雖然執行緒建立簡單,但是執行緒同步問題還是需要考慮…

Read Full Post »

Process 類別提供對本機和遠端處理序 (Process) 的存取,並讓您能夠啟動和停止本機系統處理序。因此,可以透過 Process.Start 來處理指定的文件,所以,如果在 Start 的參數中給予一個電子信箱的超連結,就可以啟動系統中預設的電子郵件處理程式。如下:
 
System.Diagnostics.Process.Start("mailto:abc@hotmail.com");
 
其實他用起來很像是 Windows 下的 start,舉個例來說,你也可以在 Console 視窗下輸入
他也會啟動系統中預設的電子郵件處理程式。
 
因此,如果你熟悉 start,你也知道它可以驅動任何的文件,例如:
start test.txt
start a.doc
start b.jpg
來引用外部程式來顯示你的資料。

Read Full Post »

Older Posts »