![](/img/trans.png)
[英]System.ArgumentException: 'Value does not fall within the expected range.'
[英]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.