“嘗試讀取或寫入受保護的記憶體這通常指示其他記憶體已損壞"。
System.AccessViolationException: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
此類錯誤屢見不鮮了,特別是映像開發,Com組件操作時,不要期望本文能夠給你一個明確的回覆,只能給你提供解決問題的思路:
解決辦法只有一種:慧眼視真或排除法,先看看排除的優先順序吧:
1.如果你用了NativeCode的資源,例如:Com、ActiveX;
沒有強制的釋放方法,底層的com組件根據你進程調用組件的次數來控制對象的增加和釋放(對象釋放會延遲,com自身的問題)。
一般是調用強制記憶體回收或ao內建的回收對象的方法,效果不明顯。
這種對象不釋放的情況,通常出現在應用程式反覆調用頻率極高的情況下,調用間隔的時間小於對象回收的速度,將報這種錯誤。
通常是自己的程式寫的機構不合理,才會產生這種情況。
自己在程式裡強制釋放COM資源,調用Marshal.ReleaseComObject()方法將不再使用的對象釋放掉
並在可能出現異常的地方去Catch,並留下日誌,轉移此異常。
2.指示測試的可執行檔與 Windows 資料執行防止功能相容。
調用dll的程式,在運行時會出現 “嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞。"
有關更多資訊,請參見 /NXCOMPAT(與資料執行防止相容)。
編譯器中加入了對DEP的安全性檢查,在編譯完後的exe檔案中取消NXCOMPAT位可解決該問題
editbin.exe /NXCOMPAT:NO myexe
3.排除環境因素:例如.net Fx 2.0和 .net Fx 2.0 SP2差距很大的,當然其他環境因素也好考慮在內。
一定要排除開發和部署環境差異引起的問題。
4.如果是突然出現這個問題,最好是復原到之前的操作,重做這個操作,例如移除控制項,再次添加;
反註冊Com,重新註冊; 如果你安裝了其他外掛程式,卸載這些外掛程式再試一試。
5.程式本身的問題。例如:資料庫訪問達到最大的並發量,出現死結。或頻繁的寫入和讀取操作,c#的記憶體回收機製造成的,即變數的回收速度大於使 用的速度造成的,這樣就需要從新設計演算法。
態度決定一切,技術改變生活
作者:winzheng
出處:http://cnblogs.com/winzheng
本文為原創作品,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利。
更多參考 http://msdn.microsoft.com/zh-cn/library/ms164911%28VS.80%29.aspx