programming:dot_net_framework
差異處
這裏顯示兩個版本的差異處。
| 下次修改 | 前次修改 | ||
| programming:dot_net_framework [2013/07/19 16:32] – 建立 wenpei | programming:dot_net_framework [2013/07/29 16:42] (目前版本) – wenpei | ||
|---|---|---|---|
| 行 4: | 行 4: | ||
| 整個架構就差不多是這樣: | 整個架構就差不多是這樣: | ||
| - | * UI - C# | + | * UI - C# Console |
| * Wrapper - Visuall C++ CLR Class Library | * Wrapper - Visuall C++ CLR Class Library | ||
| * Kernel - COM DLL | * Kernel - COM DLL | ||
| 行 17: | 行 17: | ||
| 首先建立新的 Solution,選擇 Visual C++ → CLR → Class Library | 首先建立新的 Solution,選擇 Visual C++ → CLR → Class Library | ||
| - | 接著建立 C# 的 UI Project,在 Solution Explorer 視窗裡面的 Solution ' | + | {{: |
| - | 完成後 | + | 接著建立 C# 的 Console Project,在 |
| + | |||
| + | {{: | ||
| + | |||
| + | 這邊 UI 的部分看是要選 Console Application 或是 Windows Forms Application 都可以。 | ||
| 接著在 C# 的 Project 上按滑鼠右鍵 -> Add Reference | 接著在 C# 的 Project 上按滑鼠右鍵 -> Add Reference | ||
| + | |||
| + | {{: | ||
| 選擇 Project 分頁,然後選擇剛剛建立的 CLR Project | 選擇 Project 分頁,然後選擇剛剛建立的 CLR Project | ||
| + | |||
| + | {{: | ||
| 完成後應該就可以在 C# Project 的 References 裡面看到 CLR 的 Project | 完成後應該就可以在 C# Project 的 References 裡面看到 CLR 的 Project | ||
| + | |||
| + | {{: | ||
| ==== CLR Class Library ==== | ==== CLR Class Library ==== | ||
| - | 在完成 Project 的建立之後,就可以開始寫 CLR Class 裡面所需要的功能,像是把 COM DLL 讀進來用,或是寫只有在 C++ 才能用的 Windows Imaging Component (WIC) 等等。 | + | 在完成 Project 的建立之後,就可以開始寫 CLR Class 裡面所需要的功能,像是把 COM DLL 讀進來用,或是寫只有在 C++ 才能用的 |
| 這邊範例先增加兩個簡單的功能:Add、Minus | 這邊範例先增加兩個簡單的功能:Add、Minus | ||
| 行 69: | 行 79: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | 完成後即可編譯 CLR Project,生出 Debug\CLRTest.dll 檔案。 | ||
| + | |||
| + | 這時用 Object Browser 打開 CLR Project,應該可以看到 Class 裡面有兩個 function 可以使用。 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== C# ==== | ||
| + | 建立好 CLR Project 後,在 C# 就可以很方便的直接拿來用 | ||
| + | |||
| + | < | ||
| + | using System; | ||
| + | |||
| + | using CLRTest; | ||
| + | |||
| + | namespace CLRTestConsole | ||
| + | { | ||
| + | class Program | ||
| + | { | ||
| + | static void Main(string[] args) | ||
| + | { | ||
| + | CLRTestClass clr = new CLRTestClass(); | ||
| + | Console.WriteLine(" | ||
| + | Console.WriteLine(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 若編譯錯誤,可能是平台問題,打開 C# Project 的 Properties,在 Build Tab 裡面的 Platform target 選擇 x86 | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== 進階應用 ==== | ||
| + | CLR 的特色之一就是可以直接拿 .Net Framework 的東西來用,因此要和 C# 互通特別容易,像是在 CLR 層將一張圖片檔案透過 GDI+ 打開,接著轉成 Byte Array 給 COM DLL 使用。 | ||
| + | |||
| + | 例如,COM DLL 內定義一個 buffer pointer 為 | ||
| + | BYTE *pBuffer; | ||
| + | |||
| + | 在 CLR 層定義需要用到的類別 | ||
| + | |||
| + | < | ||
| + | #using < | ||
| + | using namespace System; | ||
| + | using namespace System:: | ||
| + | using namespace System:: | ||
| + | </ | ||
| + | |||
| + | 將放在 path 的圖片打開: | ||
| + | |||
| + | Bitmap^ srcBitmap = gcnew Bitmap(path); | ||
| + | |||
| + | 透過 Bitmap.LockBits() 固定住記憶體位址,創建一塊 array< | ||
| + | |||
| + | < | ||
| + | BitmapData^ srcBitmapData = srcBitmap-> | ||
| + | IntPtr ptr = srcBitmapData-> | ||
| + | int bytes = Math:: | ||
| + | array< | ||
| + | System:: | ||
| + | pin_ptr< | ||
| + | Byte* np = p; | ||
| + | pBuffer = np; | ||
| + | |||
| + | // ...... | ||
| + | |||
| + | srcBitmap-> | ||
| + | </ | ||
| + | |||
| + | 另外一個應用就是把 UI 建立好的 Bitmap 傳到 wrapper 層,轉換成 array< | ||
| + | |||
| + | CLR 層的寫法是透過 Bitmap^% 取得一個 Bitmap 的 handle,並先產生好一塊 Byte Array 空間,COM DLL 修改完 Byte Array 後,複製到傳入的 Bitmap Handle | ||
| + | |||
| + | 關於 **^%** 的用法可參考 [[http:// | ||
| + | |||
| + | < | ||
| + | void CLRTestClass:: | ||
| + | { | ||
| + | BitmapData^ oBitmapData = outputBitmap-> | ||
| + | int bytes = Math:: | ||
| + | array< | ||
| + | pin_ptr< | ||
| + | Byte* pOPin = oPin; | ||
| + | |||
| + | // 交由 COM DLL 修改內容... | ||
| + | |||
| + | IntPtr oPtr = oBitmapData-> | ||
| + | System:: | ||
| + | outputBitmap-> | ||
| + | </ | ||
| + | |||
| + | C# 層的寫法則是先產生好一個 Bitmap,透過 ref Bitmap 的方式傳給 CLR 直接改記憶體內容,完成後即可用 PictureBox 顯示圖片 | ||
| + | |||
| + | < | ||
| + | Bitmap bmPic = new Bitmap(openFileDialog1.FileName); | ||
| + | clImgRetouch.SetWhiteBalance(ref bmPic); | ||
| + | pictureBox1.Image = (Image)bmPic; | ||
| + | </ | ||
| + | |||
| + | ==== 參考文件 ==== | ||
| + | C# Pass by Reference to CLR | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | WIC | ||
| + | * [[http:// | ||
| + | |||
| + | COM | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
programming/dot_net_framework.1374222747.txt.gz · 上一次變更: 由 wenpei
