有人問:將重要的 code 透過 dll 包起來,這個 dll 有可能被解開(反組譯)嗎?
答案:是的。
不過我的建議是,還是把 code 好好寫好。因為吾人淺見,
學生時代的 code 不至於重要到保護的目的。例如..
研究所實驗程式
不需要,否則後人要怎麼接你的研究繼續下去呢?
某些時候,重新 coding 是不必要的。也不是每個新進都是程式老手。
好了,回歸正傳,若是用 Visual Studio 開發者,可以有件單管道來讓 dll 更安全。
開啟 Microsoft Visual Studio 2010 → Visual Studio Tools →Dotfuscator Software Services。
注意:第一次使用需要註冊。
程式執行畫面,紅色部分為使用方法說明與位置。
而要觀察 Dll 裡面的類別、變數、函數...等等相關資訊,可以到資料夾:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ildasm.exe"
開啟後將要觀察的 Dll 加入即可,以下圖為例子,
開啟 WSCharpLib.dll 可以看到裡面的許多類別與函數的定義...等等。
2012-01-14
2012-01-04
關於【在 GDI+ 中發生泛型錯誤】出現的問題
System.Runtime.InteropServices.ExternalException: 在 GDI+ 中發生泛型錯誤。
在網頁上處理影像檔案時遇過 "在 GDI+ 中發生泛型錯誤" 的錯誤。
GDI 的全名是 Graphics Device Interface 的縮寫,是在 Windows 平台內十分重要的核心元件,負責處理許多跟影像物件有關的工作,包括繪製直線、曲線、字型、材質、處理縮圖、裁切圖片、...等。而 GDI+[1] 則是以 C++ 語言所開發的 GDI 介面,可直接利用系統硬體(顯示卡)資源對圖片相關操作進行加速處理[2]。
在 .NET Framework Base Class Library 中所有與繪圖有關的類別 (System.Drawing 命名空間) 也都幾乎不是 Managed 組件,幾乎都是透過 Unmanaged GDI+ 元件進行圖形操作,所以只要發生 GDI+ 的錯誤就一定不是 .NET 程式語法的錯誤,而且錯誤訊息是直接從 GDI+ 傳來的,繁體的作業系統就會回應中文訊息、英文的作業系統就會回應英文訊息,透過 Thread.CurrentThread.CurrentCulture 是沒辦法指定錯誤訊息的。
與『檔案系統』有關的問題
與『圖檔格式』有關的問題
透過 Image.FromStream 載入圖片時,其 Stream 無法使用 Seek 方法
解決之道: 將無法 Seek 的 Stream 先寫入 MemoryStream 再進行載入即可。在 MSDN 上 Image.FromStream 的備註有寫:「在 Image 的存留期內,資料流都必須保持開啟。」
[1] http://msdn.microsoft.com/en-us/library/ms533798(VS.85).aspx
[2] Graphics Device Interface - Wikipedia, the free encyclopedia
在網頁上處理影像檔案時遇過 "在 GDI+ 中發生泛型錯誤" 的錯誤。
GDI 的全名是 Graphics Device Interface 的縮寫,是在 Windows 平台內十分重要的核心元件,負責處理許多跟影像物件有關的工作,包括繪製直線、曲線、字型、材質、處理縮圖、裁切圖片、...等。而 GDI+[1] 則是以 C++ 語言所開發的 GDI 介面,可直接利用系統硬體(顯示卡)資源對圖片相關操作進行加速處理[2]。
在 .NET Framework Base Class Library 中所有與繪圖有關的類別 (System.Drawing 命名空間) 也都幾乎不是 Managed 組件,幾乎都是透過 Unmanaged GDI+ 元件進行圖形操作,所以只要發生 GDI+ 的錯誤就一定不是 .NET 程式語法的錯誤,而且錯誤訊息是直接從 GDI+ 傳來的,繁體的作業系統就會回應中文訊息、英文的作業系統就會回應英文訊息,透過 Thread.CurrentThread.CurrentCulture 是沒辦法指定錯誤訊息的。
- 目錄權限不足,無法寫入或無法讀取 ( 包括把檔案寫入 UNC 路徑 )
解決之道: 設定正確可讀取或寫入的權限 - 檔案權限不足,無法寫入或無法讀取 ( 包括把檔案寫入 UNC 路徑 )
解決之道: 設定正確可讀取或寫入的權限 - 目錄不存在,所以根本無法寫入檔案
解決之道: 先建立目錄,然後再進行寫入 ( Image.Save , Bitmap.Save )
透過 Image.FromStream 載入圖片時,其 Stream 無法使用 Seek 方法
解決之道: 將無法 Seek 的 Stream 先寫入 MemoryStream 再進行載入即可。在 MSDN 上 Image.FromStream 的備註有寫:「在 Image 的存留期內,資料流都必須保持開啟。」
[1] http://msdn.microsoft.com/en-us/library/ms533798(VS.85).aspx
[2] Graphics Device Interface - Wikipedia, the free encyclopedia
2012-01-03
C# TextBox 換行功能實現
要讓一個Windows Form的C# TextBox換行顯示多行文本,
就得把它的Multiline屬性設置為true。
可是當你要在代碼中為Text屬性設置多行文本的時候可能會遇到點麻煩。
因為常使用 C語言的關係,往往會想到直接付給一個含有換行符 "\n" 的字符串給Text屬性:
TextBox1.text = "abc\n123"; 可是實際運行的時候你卻發現它始終不會換行,
顯示的結果為 "abc123"。
解決方法:
因為C# TextBox運行在Windows上。
Windows能夠顯示的換行必須由兩個字符組成:carriage return & line feed,也就是必須是"\r\n"。
如果只是"\n"在Windows中不能顯示為換行的,這與Linux/Unix等其他的操作系統不一樣。
所以上邊如果把"\n"替換成"\r\n"就可以了。
但是
問題仍然沒有很好的解決,因為用"\r\n"能夠滿足Windows的要求了,
但是如果是其他平台怎麼辦?
為了要確保讓換行效果在各種平台上都能夠正常的顯示,請用Environment.NewLine。
它可以確保在不同的平台下都能夠返回正確的換行字符,
在Windows下是\r\n,在Linux(Mono)下就應該是\n了。
所以上面的代碼應該寫成:
TextBox1.text="abc"+Environment.NewLine+"123";
就得把它的Multiline屬性設置為true。
可是當你要在代碼中為Text屬性設置多行文本的時候可能會遇到點麻煩。
因為常使用 C語言的關係,往往會想到直接付給一個含有換行符 "\n" 的字符串給Text屬性:
TextBox1.text = "abc\n123"; 可是實際運行的時候你卻發現它始終不會換行,
顯示的結果為 "abc123"。
解決方法:
因為C# TextBox運行在Windows上。
Windows能夠顯示的換行必須由兩個字符組成:carriage return & line feed,也就是必須是"\r\n"。
如果只是"\n"在Windows中不能顯示為換行的,這與Linux/Unix等其他的操作系統不一樣。
所以上邊如果把"\n"替換成"\r\n"就可以了。
但是
問題仍然沒有很好的解決,因為用"\r\n"能夠滿足Windows的要求了,
但是如果是其他平台怎麼辦?
為了要確保讓換行效果在各種平台上都能夠正常的顯示,請用Environment.NewLine。
它可以確保在不同的平台下都能夠返回正確的換行字符,
在Windows下是\r\n,在Linux(Mono)下就應該是\n了。
所以上面的代碼應該寫成:
TextBox1.text="abc"+Environment.NewLine+"123";
以檔案系統來發行網頁程式
在 VS20XX 專案上,網頁的發行方法有:Web部屬、FTP、檔案系統、FPSE 四種。若以單純角度來看,在網頁上執行程式並得到結果(亦會在 Server 上讀寫資料),可以使用檔案系統來發行網頁程式,由於會對 Server 上的資料夾、檔案存取,所以必須設定權限。
若無設定資料的使用權限:
描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。
例外詳細資訊: System.UnauthorizedAccessException: 拒絕存取路徑 c:\inetpub\wwwroot\upload\...。沒有授權 ASP.NET 存取要求的資源...
沒有授權 ASP.NET 存取要求的資源。請考慮將資源存取權授與 ASP.NET要求識別。ASP.NET 有一個基本處理序識別 (通常在 IIS 5 上為 {MACHINE}\ASPNET,在 IIS 6 上為 Network Service),會在應用程式未模擬的情況下使用。
如果應用程式是透過 <identity impersonate="true"/> 模擬,這個識別將會是匿名使用者 (通常為 IUSR_MACHINENAME)或經過驗證的要求使用者。
若要對檔案授與 ASP.NET 存取權,請在檔案總管中以滑鼠右鍵按一下資料夾,
選擇 [內容]並選取 [安全] 索引標籤。按一下 [新增] 加入適當的使用者
或群組。反白顯示 ASP.NET 帳戶,並且選取所需存取權限的核取方塊。
由於目前網頁程式並不需要帳號來維護,所以資料夾的權限就開給IIS_IUSRS帳戶,
並依照需求設定可存取動作。
若無設定資料的使用權限:
描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。
例外詳細資訊: System.UnauthorizedAccessException: 拒絕存取路徑 c:\inetpub\wwwroot\upload\...。沒有授權 ASP.NET 存取要求的資源...
沒有授權 ASP.NET 存取要求的資源。請考慮將資源存取權授與 ASP.NET要求識別。ASP.NET 有一個基本處理序識別 (通常在 IIS 5 上為 {MACHINE}\ASPNET,在 IIS 6 上為 Network Service),會在應用程式未模擬的情況下使用。
如果應用程式是透過 <identity impersonate="true"/> 模擬,這個識別將會是匿名使用者 (通常為 IUSR_MACHINENAME)或經過驗證的要求使用者。
若要對檔案授與 ASP.NET 存取權,請在檔案總管中以滑鼠右鍵按一下資料夾,
選擇 [內容]並選取 [安全] 索引標籤。按一下 [新增] 加入適當的使用者
或群組。反白顯示 ASP.NET 帳戶,並且選取所需存取權限的核取方塊。
由於目前網頁程式並不需要帳號來維護,所以資料夾的權限就開給IIS_IUSRS帳戶,
並依照需求設定可存取動作。
2012-01-02
重新註冊 NET Framework 元件
導致 .NET Framework 發生錯誤而無法啟動某些元件,
原因有兩種:
一、有時候我們可能會因為某些原因而將IIS重新安裝,
重新安裝完後,可能會變成只有安裝 .NET Framework 的舊版本,
這時候可透過以下指令重新註冊 .NET Framework 新版本:
二、安裝 IIS 之前先安裝了.NET Framework 等。
而我碰到的問題如下:
原因有兩種:
一、有時候我們可能會因為某些原因而將IIS重新安裝,
重新安裝完後,可能會變成只有安裝 .NET Framework 的舊版本,
這時候可透過以下指令重新註冊 .NET Framework 新版本:
二、安裝 IIS 之前先安裝了.NET Framework 等。
而我碰到的問題如下:
- HTTP 錯誤 500.21 - Internal Server Error
- 處理常式 "PageHandlerFactory-Integrated" 的模組清單中有錯誤的模組 "ManagedPipelineHandler"
- 處理常式 "PageHandlerFactory-Integrated" 的模組清單中有錯誤的模組 "ManagedPipelineHandler"
解決方法:
使用管理員權限開啟 cmd ,
輸入 %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 即可!
或是 %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i 即可(x64)!
如果跳出 aspnet_regiis.exe 不是有效的Win32應用程序,
這種情況的原因可能是你的aspnet_regiis.exe可能損壞了,用複製或重新安裝都可修復。
輸入 %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 即可!
或是 %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i 即可(x64)!
如果跳出 aspnet_regiis.exe 不是有效的Win32應用程序,
這種情況的原因可能是你的aspnet_regiis.exe可能損壞了,用複製或重新安裝都可修復。
For more Information:
Windows 7 安裝 IIS 服務
在 Windows 7 的環境下,若要利用 Visual Studio 20XX 開發 ASP.NET 程式,
則 控制台 | 程式集 | 開啟或關閉 Windows 功能 設定如下:
而且 VS20XX 執行時要按滑鼠右鍵,以系統管理員身分執行,如果才能存取 本機 IIS。
IIS 管理員 位於 控制台 | 系統及安全性 | 系統管理工具。
除此之外,若要由其它電腦連到本機的 IIS,那還需要設定防火牆如下:
則 控制台 | 程式集 | 開啟或關閉 Windows 功能 設定如下:
而且 VS20XX 執行時要按滑鼠右鍵,以系統管理員身分執行,如果才能存取 本機 IIS。
IIS 管理員 位於 控制台 | 系統及安全性 | 系統管理工具。
除此之外,若要由其它電腦連到本機的 IIS,那還需要設定防火牆如下:
For More Information - http://technet.microsoft.com/zh-tw/library/cc725762(WS.10).aspx
訂閱:
意見 (Atom)





