日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET 4.0 调用 C dll 触发 AccessViolationException 异常的处理方案

發布時間:2025/3/11 asp.net 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET 4.0 调用 C dll 触发 AccessViolationException 异常的处理方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、問題

最近做項目的時候,在調用 c 寫的 dll 的時候,遇到一個程序異常,發現捕捉不到,異常為:System.AccessViolationException

二、解決方案

詳細內容和原理可以看下面引用的內容,我這里使用的方法是在方法名上面添加屬性:

[HandleProcessCorruptedStateExceptions] public static void main(){//TODO }
三、轉載內容

引用鏈接地址:.NET 4.0里異常處理的新機制

.NET 4.0里異常處理的新機制
前幾天,有一個朋友問我為什么在.NET里不能捕捉(catch)到一些異常了,而且在調試器里也捕捉不到。研究了一下,是.NET 4.0里新的異常處理機制搗的鬼。

在.NET 4.0之后,CLR將會區別出一些異常(都是SEH異常),將這些異常標識為破壞性異常(Corrupted State Exception)。針對這些異常,CLR的catch塊不會捕捉這些異常,即使你用類似下面的代碼:

try {TestMethod(); } catch (Exception e) {Console.WriteLine("Catching exception: {0}", e); }

也沒有辦法捕捉到這些異常。之所以要這樣設計,在MSDN的文章Handling Corrupted State Exceptions里已經提到了。即,有一些支持插件的程序,例如Visual Studio或者SQL Server,它們支持調用托管代碼編寫成的插件,但是它們自己本身有很多代碼是由非托管的C++寫成的。由于插件經常會調用到非托管的API,而很多時間,這些插件的代碼根本就不知道如何處理非托管的API拋出來的SEH異常。在4.0以前,因為SEH異常被轉換成了跟普通.NET異常相同的異常,這樣程序員只要用catch ( Exception e)的模式就可以捕捉到所有的異常。這樣處理的問題是,由于SEH異常通常都不是托管代碼拋出的,托管代碼根本就不知道SEH異常被扔出來的原因,簡單的catch ( Exception e)處理使得整個程序會處于一個非常不穩定的狀態,使得前面被忽略的問題在后面以更嚴重的方式出現 — 例如保存被破壞的數據。這樣,看起來使用catch ( Exception e)處理所有的異常的方法很簡單,但實際上讓程序員或者用戶在問題延后發生時,分析起來需要花費更多的精力。

因此在4.0以后,大部分SEH(我懷疑是所有)異常都被標識成破壞性異常,在.NET里,默認情況下CLR不會捕捉它們,而是任由操作系統來處理—即關閉程序,并打開一個錯誤對話框通知用戶。為了保證兼容性,在4.0以前編譯的程序,例如在2.0、3.0和3.5編譯的程序,依然采用的是老的策略—即.NET會同時捕捉.NET異常和SEH異常。而在4.0下面編譯的程序才會使用新的策略,這也是在文章的開頭,我的朋友所碰到的問題。你可以在.NET 4.0下面編譯下面的程序,體驗一下這個新變化:

Program.cs:

using System; using System.Runtime.InteropServices; namespace ConsoleApplication1 {class Program{[DllImport("Ref.dll")]private extern static void TestMethod();static void Main(string[] args){try{ TestMethod(); }catch (Exception e){Console.WriteLine("Catching exception: {0}", e);}}} }

Ref.cpp:

#include "stdafx.h" extern "C" __declspec(dllexport) void TestMethod() {int *p = NULL;// 會導致.NET拋出一個AccessViolation異常*p = 10; }

上面的代碼里,Program.cs使用P/Invoke技術調用了Ref.dll文件里的TestMethod,但是TestMethod嘗試給一個空指針賦值,導致一個AccessViolation異常。如果你在2.0下面編譯program.cs,并執行的話,這個AccessViolation異常會被catch(Exception e)捕捉到,而如果你在4.0下面編譯并執行的話,你會發現catch (Exception e)是不能捕捉到這個異常的。

然而并不是所有人都想要這個新的異常機制,如果你的程序是在4.0下面編譯并運行,而你又想在.NET程序里捕捉到SEH異常的話,有兩個方案可以嘗試:

1、在托管程序的.config文件里,啟用legacyCorruptedStateExceptionsPolicy這個屬性,即簡化的.config文件類似下面的文件:

App.config:

<?xml version="1.0"?> <configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><runtime><legacyCorruptedStateExceptionsPolicy enabled="true" /></runtime> </configuration>

這個設置告訴CLR 4.0,整個.NET程序都要使用老的異常捕捉機制。

2、在需要捕捉破壞性異常的函數外面加一個HandleProcessCorruptedStateExceptions屬性,這個屬性只控制一個函數,對托管程序的其他函數沒有影響,例如:
[HandleProcessCorruptedStateExceptions] static void Main(string[] args) {try{ TestMethod(); }catch (Exception e){Console.WriteLine("Catching exception: {0}", e);} }

總結

以上是生活随笔為你收集整理的.NET 4.0 调用 C dll 触发 AccessViolationException 异常的处理方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.久久综合 | 国产精品久久久久久亚洲av | 亚洲第八页| 久久麻豆av| 嫩草影院av | 精品久久99| 顶臀精品视频www | 裸体美女免费视频网站 | 色吊丝中文字幕 | 色哟哟网站入口 | 国产日韩av一区二区 | 欧美日韩电影一区二区三区 | 欧美性生活在线视频 | 久久久久久久久久影院 | 免费古装一级淫片潘金莲 | 久久国产色av免费观看 | 91激情在线观看 | 女女互慰吃奶互揉调教捆绑 | 中文字幕+乱码+中文字幕明步 | 久热精品免费视频 | 欧美激情欧美激情在线五月 | av成人免费在线观看 | 成人高清在线 | 国产精品一区二区三区久久久 | 蜜臀久久99精品久久久久久宅男 | 国产免费一区二区三区最新不卡 | 在线观看国产麻豆 | 亚洲男人天堂网址 | 国产福利在线播放 | 成人免费xxxxx在线观看 | 国产freexxxx性播放麻豆 | 国产3p露脸普通话对白 | 91综合色 | 在线不卡免费视频 | 亚洲AV蜜桃永久无码精品性色 | 国产精品一区二区免费在线观看 | 国产高清精品在线 | 天天激情站 | 久久精品欧美日韩 | 污污在线免费观看 | 成人av在线一区二区 | 国产视频网站在线观看 | 91福利视频网 | 色屁屁www影院免费观看入口 | 亚洲国产精品成人无码区 | 性一区| 一区二区三区 欧美 | 伊人久久大香网 | 美女精品在线 | 日本爱爱免费视频 | 国产在线aaa | 女优中文字幕 | 国产高清精品软件丝瓜软件 | 亚欧中文字幕 | 鸥美毛片 | 一区二区三区在线视频播放 | 黄在线观看免费 | 五个女闺蜜把我玩到尿失禁 | 国产a一级 | 免费在线看黄网站 | 亚洲综合大片69999 | 欧美日韩亚洲在线观看 | 潘金莲一级淫片a.aaaaa播放 | 亚洲日本精品一区 | 国产欧美精品国产国产专区 | 2019中文在线观看 | 性xxxx | 黄色欧美网站 | 亚洲一区二区黄 | aaa国产 | 国产视频在线观看视频 | 乳色吐息在线看 | 日本黄色一级视频 | 国产精品男人的天堂 | 夜夜爽av| 毛片在线免费视频 | 香蕉视频官网在线观看 | 欧美日韩性生活视频 | 亚洲欧美日韩一区二区三区在线观看 | 国产精品久久久久久久久免费软件 | 亚洲精品国产熟女久久久 | 精品午夜福利视频 | 国产伦精品免费视频 | 欧美成人一区二区在线 | 女人洗澡一级特黄毛片 | av播播| 国产午夜在线观看 | 深夜视频在线免费观看 | 蜜桃视频在线观看www | 男女搞黄网站 | 欧美1区2区3区 | 欧美黑人一区二区三区 | 精品国产乱码久久久久久婷婷 | 偷拍久久久 | 亚洲一区二区三区四区五区xx | 国产精品视频免费在线观看 | 狠狠摸狠狠操 | 亚洲字幕成人中文在线观看 | 亚洲免费一二三区 |