簡體   English   中英

Application.Run(new Form1()) 拋出 System.ArgumentException: '值不在預期范圍內。'

[英]Application.Run(new Form1()) throws System.ArgumentException: 'Value does not fall within the expected range.'

我難住了。

我開始實施一個接受命令行參數的 Forms 應用程序版本,但開始出現錯誤。 我恢復了我的更改 - 但這個例外仍然存在:

該項目編譯正常,但是當我啟動應用程序(調試)時,就在我的主窗體顯示之后,應用程序停止拋出以下異常:

System.ArgumentException 發生 HResult=0x80070057 消息=值不在預期范圍內。 Source= StackTrace:在 Accessibility.IAccessible.get_accChild(Object varChild) at System.Windows.Forms.AccessibleObject.Accessibility.IAccessible.get_accChild(Object childID) at System.Windows.Forms.InternalAccessibleObject.System.Windows.Forms.UnsafeNativeMethods.IAccessibleInternal .get_accChild(對象childID)

編輯/供參考:我已經“啟用僅我的代碼關閉-當它打開不會發生這種情況
我仍然以某種方式沒有找到有問題的代碼。 單步執行Form1()所有內容使我返回到 Program.cs 中的調用,在那里突然發生異常。
我會設法讓我的項目以一種或另一種方式最終運行-我仍然很想知道問題出在哪里以及問題是什么(對我和后代而言)-仍然非常感謝任何提示和幫助

從那以后,我將應用程序精簡到了骨架,只顯示了主窗體,沒有做任何事情。 我仍然收到這條奇怪的消息。 顯示錯誤

程序.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

哪里出錯了?

我遇到了相同的堆棧跟蹤並進行了一些挖掘。 作為參考,我正在使用.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 消息循環的每次迭代都會觸發此異常。 添加一個或多個項目會使它消失。 我發現一個奇怪的怪癖是,如果我在迭代之間選擇一個不同的控件,異常將停止觸發,直到我再次單擊空列表框。

一個潛在的解決方法是通過設計器向列表框添加一個空字符串項目,並在添加第一個真實項目/設置數據源時進行相應處理。 在忽略這個異常時,我沒有注意到任何異常行為,所以我認為讓框架吞下它比添加額外的變通邏輯更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM