我已经处理这个问题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样式)
即使使用静态数据也会崩溃!:
其他线程正在运行,尽管这些线程不是由我启动的。
1条答案
按热度按时间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称之为不安全:
我解决这个问题超过一年的东西这么愚蠢...我的应用程序必须崩溃超过1000次,每次需要2分钟加载:(,为什么微软会留下这样愚蠢的错误是我无法理解的。