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

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

  我碰到这个问题比较奇怪,我写的一个方法(基于.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。

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

 

 

目录
相关文章
|
存储 SQL 分布式计算
【存储】2022 年的 4 个开源对象存储平台
【存储】2022 年的 4 个开源对象存储平台
|
6月前
|
人工智能 JavaScript 数据挖掘
自媒体人必备OpenClaw使用手册:核心技能、阿里云/本地部署流程与免费模型配置教程
对于自媒体博主、短视频运营、公众号作者、内容策划及个人品牌打造者而言,高效的创作工具与自动化能力是提升内容产出效率、降低运营成本的关键。OpenClaw作为一款集成海量技能的AI工具平台,内置超13000项功能,覆盖内容创作、社媒运营、数据分析、自动化执行等全场景,但多数功能对自媒体从业者而言并非刚需。本文从海量技能中筛选出10项自媒体运营核心技能,同时详细说明2026年阿里云部署、本地MacOS/Linux/Windows11部署OpenClaw(Clawdbot)的完整流程,以及阿里云千问大模型API、免费Coding Plan API的配置方法,搭配实操代码与常见问题解答,帮助自媒体人快
1161 5
|
Java 图形学 Python
用Python和Pygame打造绚丽烟花效果+节日祝福语
本文介绍了一款基于Python和Pygame库实现的烟花效果程序,模拟烟花发射、爆炸及粒子轨迹,结合动态文本显示祝福语,营造逼真的节日氛围。程序包括烟花类、粒子类、痕迹类和动态文本显示功能,通过随机化颜色、速度和粒子数量增加效果多样性。用户可以看到烟花从屏幕底部发射、上升并在空中爆炸,伴随粒子轨迹和动态祝福语“蛇年大吉”、“Happy Spring Festival”。文章详细解析了核心代码逻辑和技术要点,帮助读者理解如何利用Pygame库实现复杂视觉效果,并提供了未来改进方向,如优化性能、增加特效和增强交互性。
1697 20
用Python和Pygame打造绚丽烟花效果+节日祝福语
|
域名解析 弹性计算 网络协议
nslookup 域名结果正确,但是 ping 域名失败
&gt; 最近两周碰到了不同场景下四个DNS问题,所以记录一下 这几个Case描述如下: 1. 一批ECS nslookup 域名结果正确,但是 ping 域名 返回 unknown host 1. 在公司网下,我的windows7笔记本的wifi总是报dns域名异常无法上网(通过IP地址可以上网) 1. Docker集群中两个容器中 nslookup 同一个域名,返回来的IP不一样
12981 1
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
Windows
windows 技巧篇-查看文件夹被那个进程占用,文件夹占用解除方法
windows 技巧篇-查看文件夹被那个进程占用,文件夹占用解除方法
3337 0
windows 技巧篇-查看文件夹被那个进程占用,文件夹占用解除方法
安装VS2015时出现“安装包丢失或损坏”
安装VS2015时出现“安装包丢失或损坏”
如何查看SQLSERVER的版本信息和SP补丁信息
如何查看SQLSERVER的版本信息和SP补丁信息
847 1
|
存储 Apache Swift
无限套娃_docker入门(镜像、容器、仓库)
无限套娃_docker入门(镜像、容器、仓库)
397 0