我碰到這個問題比較奇怪,我寫的乙個方法(基於.net 2.0)在win7、win2003下執行沒有問題,在winxp下執行就拋異常:「公共語言執行時檢測到無效的程式」,對應英文為:common language runtime detected an invalid program.
拋異常的方法**摘抄如下:
private control control =...;public
void actiononui(bool showmessageboxonexception, bool begininvoke, cbgeneric
method, params
object
args)
else
}else
catch
(exception ee)}}
}
方法的目的是對ui呼叫**做乙個封裝,讓使用者更方便的將呼叫**到ui執行緒。
但是,這個方法在執行時,異常在xp下發生了:
common language runtime detected an invalid program.
at esbasic.helpers.uisafeinvoker.actiononui[t1](boolean showmessageboxonexception, boolean begininvoke, cbgeneric`1 method, object args)
我在網上搜了一些相關問題的解答,比較靠譜的一點是這樣說的:
「這種錯誤非常少見,是乙個編譯器錯誤,通常產生在將c#等託管語言生成為msil時候出的錯,沒有什麼好的解決辦法,現在可行的方法好像就是修改現在的程式結構,這樣根據新的結構生成新的msil時不會出錯就基本可以避免這個問題。」
根據這個提示,我對方法的**進行了各種修改嘗試,最後終於得到了一種在xp下也不拋異常的結構,貼上如下:
privatecontrol control =...;
public
void actiononui(bool showmessageboxonexception, bool begininvoke, cbgeneric
method, t1 args)
this.control.invoke(new cbgeneric, t1>(this.do_actiononui), showmessageboxonexception, method, args);
return
; }
this.do_actiononui(showmessageboxonexception, method, args);
}private
void do_actiononui(bool showmessageboxonexception, cbgeneric
method, t1 args)
catch
(exception ee)
}}
總結起來,改變的幾點如下:
(1)將真正執行的部分重構為乙個方法do_actiononui,然後,**呼叫invoke都指向這個方法。
(2)invoke**呼叫時,為指向的方法加上泛型引數,避免編譯器自動去匹配。
(3)將弱型別的引數object修改為強型別的引數t1。
好吧,現在問題總算是解決了,好好折騰了一番啊~~
CLR via C 1 3 載入公共語言執行時
原文 clr via c 1.3 載入公共語言執行時 1.你生成的每個程式集可以是exe,也可以是dll。最終都是有clr管理這些程式集中 的執行。2.vs2010中,建立新的exe專案時,預設平台是x86,而不是anycpu。3.windows的64位版本提供了乙個名為wow64 windows ...
CLR via C 1 3 載入公共語言執行時
1.你生成的每個程式集可以是exe,也可以是dll。最終都是有clr管理這些程式集中 的執行。2.vs2010中,建立新的exe專案時,預設平台是x86,而不是anycpu。3.windows的64位版本提供了乙個名為wow64 windows on windows64 的技術,允許允許32位的wi...
執行時異常
常見的幾種如下 nullpointerexception 空指標引用異常 classcastexception 型別強制轉換異常。illegalargumentexception 傳遞非法引數異常。arithmeticexception 算術運算異常 arraystoreexception 向陣列中...