解決異常 公共語言執行時檢測到無效的程式

2022-03-01 22:18:14 字數 1667 閱讀 9657

我碰到這個問題比較奇怪,我寫的乙個方法(基於.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下也不拋異常的結構,貼上如下:

private

control 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 向陣列中...