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

问题描述

C#运行时报错,.Net版本为2.0,仅在在WindowsXP系统上运行出现该问题

问题定位

定位到报错代码段位于一段调用封装的代码,由于.Net 2.0版本需要判断在该线程是否能调用UI更新的相应动作,若不能,需要调用Invoke方法进行更新。

原代码如下:

public static class ControlExtensions
    {

        delegate void InvokeIfRequiredDelegate<TControl>(TControl ctrl, Action<TControl> action);

        public static void InvokeIfRequired<TControl>(TControl ctrl, Action<TControl> action)
            where TControl : System.Windows.Forms.Control {
                try
                {
                    if (ctrl.InvokeRequired)
                    {
                        ctrl.Invoke(new InvokeIfRequiredDelegate<TControl>(ControlExtensions.InvokeIfRequired), ctrl, action);
                    }
                    else
                    {
                        action(ctrl);
                    }
                }
                catch (Exception ex) {
                    Console.WriteLine("Error invokeing" + ex.ToString());
                }
        } 
    }

经查找资料,确定问题处在调用逻辑中,而且该问题是由于类型推断不正确引发的。仅在特定的.Net版本中才会出现。

解决思路

既然定位是由于编译器类型推断引发的,只能修改代码结构,避免触发编译器的bug。

经实验,将上述代码修改为如下内容即可解决问题:

public static class ControlExtensions
    {

        delegate void InvokeIfRequiredDelegate<TControl>(TControl ctrl, Action<TControl> action);

        public static void InvokeIfRequired<TControl>(TControl ctrl, Action<TControl> action)
            where TControl : System.Windows.Forms.Control {
                try
                {
                    if (ctrl.InvokeRequired)
                    {
                        ctrl.Invoke(new InvokeIfRequiredDelegate<TControl>(ControlExtensions.CallAction<TControl>), ctrl, action);
                    }
                    else
                    {
                        ControlExtensions.CallAction<TControl>(ctrl, action);
                    }
                }
                catch (Exception ex) {
                    Console.WriteLine("Error invokeing" + ex.ToString());
                }
        }

        private static void CallAction<TControl>(TControl ctrl, Action<TControl> action)
        {
            action(ctrl);
        }

    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注