winforms C#进程,开始随机引发AccessViolationException

r8uurelv  于 2023-03-09  发布在  C#
关注(0)|答案(1)|浏览(206)

我已经处理这个问题3个月了。
我在本机调试中遇到的错误:
"FileReader.exe中的0x5A222FC2(comct123.dll)处抛出异常:0xC0000005:读取位置0x0000000C时发生访问冲突。"
正常调试:
在System.Windows.Forms.dll中出现"系统访问违规异常"
我的设置非常简单:

public static Form_Interface Interface;

public static void Initialize()
{
    Application.SetCompatibleTextRenderingDefault(false);
    Interface = new Form_Interface();
    Interface.Filesdgv.DataSource = File.SortableBindingList;
    Application.Run(Interface);
}

看起来很简单,对吧?不。所以基本上我有一个简单的事件,它只是使用Process.Start()打开文件,无论我做什么,它都会随机崩溃,并在System.Windows.Forms.dll中显示'System.AccessVioliationException':

private void Filesdgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    Filesdgv.Invoke((Action)(() =>
    {
        try
        {
            int rowIndex = e.RowIndex;

            if (rowIndex >= 0)
            {
                int columnIndex = e.ColumnIndex;
                File file = (File)((DataGridView)sender).Rows[rowIndex].DataBoundItem;

                switch (columnIndex)
                {
                    case 0:
                        {
                            Process.Start(file.Location);
                        }
                        break;
                }
            }
        }
        catch
        {
            // This fking catch never works anyway.
        }
    }));
}

private void FileInterface_Load(object sender, EventArgs e)
{
    foreach (string oCurrent in Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Files To Check")))
        if (oCurrent.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
            new File(oCurrent.Split('\\').Last(), oCurrent);
}

不管我是打开文件/链接还是其他什么,它的行为都是一样的。链接和文件位置也是只读字段。
我有许多其他用途来读取行数据,它从来没有崩溃,即使我的垃圾邮件点击10000次,它只会崩溃随机与process.start()
我尝试过的事情:

  • 使用开始调用
  • 使用调用
  • 未使用调用/BeginInvoke
  • 在读取文件链接之前将其放入字符串中。
  • 使用多个Try Catch
  • 在另一台机器上重新编码...同样的结果也在那里。
  • 我试过使用File.Open(要么不打开文件,要么抛出相同的错误lmao)
  • 已尝试使用[HandleProcessCorruptedStateExceptions],但仍无法捕获异常。
  • 不要紧,如果我点击慢或快仍然1/30的机会发生。
  • 尝试将任务.运行(()=〉进程.启动());你会认为线程会保护你不受异常的影响吗?没有仍然崩溃...

文件类如下所示:

public class File
{
    public static SortableBindingList<File> SortableBindingList = new SortableBindingList<File>(new List<File>());
    public readonly string fileName;
    public readonly string filePath;
    
    public void AddRow()
    {
        Client.Interface.Invoke((Action)(() =>
        {
            lock (SortableBindingList)
                if (!SortableBindingList.Contains(this))
                    SortableBindingList.Add(this);
        }));
    }

    public string FileName
    {
        get
        {
            return fileName;
        }
    }

    public string Location
    {
        get
        {
            return filePath;
        }
    }
    public File(string fileName, string filePath)
    {
        this.fileName = fileName;
        this.filePath = filePath;
        AddRow();
    }
}

Initalize()在静态void Main(string [] args)btw中被调用。没有其他线程运行编辑东西或类似的东西,唯一运行的线程是等待用户输入的表单线程。
我正在寻找的解决方案:

  • 启动文件/超链接的替代方法。
  • 避免窗体崩溃的方法(尝试catch样式)

即使使用静态数据也会崩溃!:

其他线程正在运行,尽管这些线程不是由我启动的。

vs3odd8k

vs3odd8k1#

此错误的100%修复方法是用途:Application.EnableVisualStyles();

因为这是comctl32.dll v5中的一个已知问题。当应用程序使用VisualStyles时,它会强制加载comctl32.dll v6,它修复了这个问题。我在阅读此线程时找到了解决方案:https://github.com/Microsoft/dotnet/issues/402问题的原因是使用了Process.Start(),该函数使用了不安全的本机Windows DLL API函数,这些函数是32位的,即使stacktrace称之为不安全:

StackTrace  "at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)\r\n..."

我解决这个问题超过一年的东西这么愚蠢...我的应用程序必须崩溃超过1000次,每次需要2分钟加载:(,为什么微软会留下这样愚蠢的错误是我无法理解的。

相关问题