解决异常:公共语言运行时检测到无效的程序

  我碰到这个问题比较奇怪,我写的一个方法(基于.NET 2.0)在win7、win2003下运行没有问题,在winxp下运行就抛异常:“公共语言运行时检测到无效的程序”,对应英文为:common language runtime detected an invalid program.

  抛异常的方法代码摘抄如下:

    private Control control = ...;
    public void ActionOnUI<T1>(bool showMessageBoxOnException, bool beginInvoke,  CbGeneric<T1> method, params object[] args)
    {
        if (this.control.InvokeRequired)
        {
            if (beginInvoke)
            {
                this.control.BeginInvoke(new CbGeneric<bool, bool, CbGeneric<T1>, object[]>(this.ActionOnUI), showMessageBoxOnException, beginInvoke, method, args);
            }
            else
            {
                this.control.Invoke(new CbGeneric<bool, bool, CbGeneric<T1>, object[]>(this.ActionOnUI), showMessageBoxOnException, beginInvoke, method, args);
            }
        }
        else
        {
            try
            {
                method((T1)args[0]);
            }
            catch (Exception ee)
            {                if (showMessageBoxOnException)
                {
                    MessageBox.Show(ee.Message);
                }
            }
        }
    }

    方法的目的是对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<T1>(bool showMessageBoxOnException, bool beginInvoke, CbGeneric<T1> method, T1 args)
    {
        if (this.control.InvokeRequired)
        {
            if (beginInvoke)
            {
                this.control.BeginInvoke(new CbGeneric<bool, CbGeneric<T1>, T1>(this.Do_ActionOnUI<T1>), showMessageBoxOnException, method, args);
                return;
            }
            this.control.Invoke(new CbGeneric<bool, CbGeneric<T1>, T1>(this.Do_ActionOnUI<T1>), showMessageBoxOnException, method, args);
            return;
        }

        this.Do_ActionOnUI<T1>(showMessageBoxOnException, method, args);
    }

    private void Do_ActionOnUI<T1>(bool showMessageBoxOnException, CbGeneric<T1> method, T1 args)
    {
        try
        {
            method(args);
        }
        catch (Exception ee)
        {            if (showMessageBoxOnException)
            {
                MessageBox.Show(ee.Message);
            }
        }
    } 

  总结起来,改变的几点如下:

(1)将真正执行的部分重构为一个方法Do_ActionOnUI,然后,转发调用Invoke都指向这个方法。

(2)Invoke转发调用时,为指向的方法加上泛型参数,避免编译器自动去匹配。

(3)将弱类型的参数object[]修改为强类型的参数T1。

  好吧,现在问题总算是解决了,好好折腾了一番啊~~

 

 

时间: 2024-09-28 12:37:34

解决异常:公共语言运行时检测到无效的程序的相关文章

异常-C#运行时出现错误,求大神指点

问题描述 C#运行时出现错误,求大神指点 "System.FormatException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 输入字符串的格式不正确. 为什么doubleparse那里错了? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.L

如何解决IE浏览器运行时提示“出现运行错误,是否纠正错误”

  故障分析与排除:根据故障现象分析,此故障可能是浏览的网站本身的问题或IE对某些脚本不支持引起的,可以将浏览器升级到新的版本或禁止脚本调试来解决.首先浏览其他网站观察,发现同样出现此错误提示,看来是IE对某些脚本不支持引起的故障.单击IE工具具--Internet选项"命令,然后在打开的对话框中单击"高级"选项卡;接着在对话框中选中"禁止脚本调试"复选框,最后单击"确定"按钮,检测,故障排除.

C#技术漫谈之公共语言运行库(CLR)

概述 .NET Framework的核心是其运行库的执行环境,称为公共语言运行库(CLR)或.NET运行库.通常将在CLR的控制下运行的代码称为托管代码(managed code). 但是,在CLR执行编写好的源代码之前,需要编译它们(在C#中或其它语言中).在.NET中,编译分为两个阶段: 1.把源代码编译为Microsoft中间语言(IL). 2.CLR把IL编译为平台专用的代码. 这个两阶段的编译过程非常重要,因为Microsoft中间语言(托管代码)是提供.NET的许多优点的关键. .N

混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...

今天在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0,同时准备进一步完善,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常:   混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集   其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的Sy

z/OS LE对程序运行时参数的支持

z/OS 操作系统中Language Environment(LE) 组件为应用程序提供了一组强大的运行时参数(run- time option : RTO)支持.对于开发人员来说,通过在应用程序中设置恰当的RTO,不仅可以快速查看运行时环境数据,提高程序调试的效 率:而且还能够设置LE提供的一系列Callable Services,快速处理异常和中断. 1 RTO分类 LE RTO 主要分为系统环境(eg. ENV),文件(eg. FILEHIST),堆栈管理(eg. HEAP,  HEAPP

调试-MFC 程序运行时出现空指针

问题描述 MFC 程序运行时出现空指针 MFC程序在启动过程中对一个变量进行初始化,之后放在定时器里运行,第一次执行时正常的,从第二次开始就出现空指针.采用单步调试每次都进入反编译页面,按F5键再次进入定时器变量依然为空指针,请问大家有没有遇到过这样的问题,怎么解决的?? 解决方案 具体要看程序.像数组越界之类的隐蔽bug也可能造成对变量的无意修改. 解决方案二: python 程序运行时出现DLL load errorjava--程序运行时出现内存溢出VC++程序运行时出现Runtime er

运行时和编译时元编程—运行时元编程

原文链接   译文链接   译者:JackWang 运行时和编译时元编程 第一部分 Groovy语言支持两种风格的元编程:运行时元编程和编译时元编程.第一种元编程支持在程序运行时修改类模型和程序行为,而第二种发生在编译时.两种元编程有各自的优缺点,在这一章节我们将详细讨论. 注:译者也是第一次接触Groovy,由于时间和水平有限(姑且让译者使用这个理由吧,对待知识本应该一丝不苟)部分专有名词可能翻译不准确甚至有误(读者阅读的过程中最好能参考原文),恳请读者不吝留言指出,谢谢! 1.运行时元编程

c++程序运行时出现string subscript out of range

问题描述 c++程序运行时出现string subscript out of range int main(){ vector a; string s; while(getline(cin,s)){ a=spite(s); for(vector<string>::size_type i=0;i!=a.size();i++) cout << a[i] << endl; } return 0; } vector spite([如果在这里加上const则可以正常运行]stri

运行时和编译时元编程—运行时元编程(一)

运行时和编译时元编程 第一部分 Groovy语言支持两种风格的元编程:运行时元编程和编译时元编程.第一种元编程支持在程序运行时修改类模型和程序行为,而第二种发生在编译时.两种元编程有各自的优缺点,在这一章节我们将详细讨论. 注:译者也是第一次接触Groovy,由于时间和水平有限(姑且让译者使用这个理由吧,对待知识本应该一丝不苟)部分专有名词可能翻译不准确甚至有误(读者阅读的过程中最好能参考原文),恳请读者不吝留言指出,谢谢! 1.运行时元编程 通过运行时元编程,我们可以推迟运行时的分支决策(译者