【问题标题】:Application.Run(new Form1()) throws System.ArgumentException: 'Value does not fall within the expected range.'Application.Run(new Form1()) throws System.ArgumentException: '值不在预期范围内。'
【发布时间】:2018-02-11 17:23:00
【问题描述】:

我被难住了。

我开始实现我的表单应用程序的一个版本,它接受命令行参数,但开始出现错误。我恢复了我的更改 - 但此异常仍然存在:

项目编译正常,但是当我启动应用程序(调试)时,就在我的主窗体显示之后,应用程序停止并抛出以下异常:

System.ArgumentException 发生 H结果=0x80070057 Message=Value 不在预期范围内。 来源= 堆栈跟踪: 在 Accessibility.IAccessible.get_accChild(Object varChild) 在 System.Windows.Forms.AccessibleObject.Accessibility.IAccessible.get_accChild(对象 childID) 在 System.Windows.Forms.InternalAccessibleObject.System.Windows.Forms.UnsafeNativeMethods.IAccessibleInternal.get_accChild(Object childID)

编辑/仅供参考: 我已将“仅启用我的代码”关闭 关闭 - 这个当它打开时不会发生 on
我仍然不知何故没有找到有问题的代码。单步执行 Form1() 中的所有内容将返回到 Program.cs 中的调用,其中突然发生异常。
我将设法让我的项目最终以一种或另一种方式运行- 我仍然很想知道问题出在哪里以及问题出在哪里(对我和后代而言)- 任何提示和帮助仍然非常感谢

从那以后,我将应用程序缩减到了最基本的部分,只显示主窗体,没有做任何事情。我仍然收到这个奇怪的信息。

program.cs:

using System;
using System.Windows.Forms;

namespace Move_Stuff
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Form1.cs:

using System;
using System.Windows.Forms;

namespace Move_Stuff
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            MessageBox.Show("Fine so far");
        }
    }
}

所以这些可能不是罪魁祸首。

这是我完整的项目文件夹: https://mega.nz/#!9mQVWLqI!MN1tYS4cQk5-ZolosDvvIme2_Lk9rjSogPhHzrJvPt0

哪里出了问题?

【问题讨论】:

  • 我的第一个猜测是它在设计器文件中,即在 InitializeComponent() 中... 把它注释掉怎么样?
  • Form1.Designer.cs?除了private System.ComponentModel.IContainer components = null;.Dispose() 方法的覆盖和所有控件的声明(如private System.Windows.Forms.Button bClear;)之外什么都没有。我应该注意什么?
  • 大概是在InitializeComponent()主体内部的开头设置一个断点,然后单步执行直到抛出异常?
  • 直到initializeComponent() 之后才抛出异常。 .Load() 中的消息框在它发生之前显示良好:/
  • 好的,没听懂。然后尝试创建一个新项目并将cs文件复制到其中。也许是项目设置中的东西......

标签: c# .net winforms visual-studio


【解决方案1】:

我遇到了相同的堆栈跟踪并进行了一些挖掘。作为参考,我使用.Net Framework 4.7.1。根本原因似乎是 Winforms 的问题,该问题仅在调用 Accessibility 类中的非托管方法并且列表框没有项目时发生在列表框控件内。我用 dotpeek 检查了源代码并想逐步完成,但我不确定非托管代码如何/是否可能。这是反汇编的罪魁祸首。

// Method get_accChild with token 06000023
[/*Attribute with token 0C000041*/DispId(-5002)]
[/*Attribute with token 0C000042*/TypeLibFunc(TypeLibFuncFlags.FHidden)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[return: MarshalAs(UnmanagedType.IDispatch)]
object get_accChild(/*Parameter with token 08000098*/[MarshalAs(UnmanagedType.Struct), In] object varChild); 

重现此问题的最简单方法是创建一个新的 Winforms 项目,通过设计器添加一个列表框,确保没有项目添加到其集合中。关闭“仅我的代码”进行调试。似乎 Winforms 消息循环的每次迭代都会触发此异常。添加一个或多个项目使其消失。我发现一个奇怪的怪癖是,如果我在两次迭代之间选择不同的控件,异常会停止触发,直到我再次单击空列表框。

一个潜在的解决方法是通过设计器将单个空字符串项添加到列表框,并在添加第一个实际项/设置数据源时进行相应处理。忽略此异常时,我没有注意到任何异常行为,因此我认为让框架吞下它比添加额外的解决方法逻辑更好。

【讨论】:

  • 哇,感谢您的深入了解!这肯定有助于深入了解这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多