OpenFileDialog抛出System.IO.FileNotFoundException:无法加载System.Drawing.Common程序集的问题求助
解决System.Drawing.Common加载失败与OpenFileDialog无法弹出的问题
嘿,我看你这问题核心在于System.Drawing.Common程序集加载失败,这直接卡死了OpenFileDialog的初始化,所以窗口才弹不出来。我给你几个实打实的排查和解决方向,你挨个试试:
1. 先确认System.Drawing.Common NuGet包装对了
这个错误80%都是因为项目没引用这个包或者版本不对:
- 打开你的NuGet包管理器,搜
System.Drawing.Common,确认它已经装到你的项目里了 - 如果是.NET Core/.NET 5+的项目,这个包是必须手动装的;要是.NET Framework项目,虽然自带System.Drawing,但有时候也会因为引用丢失出问题,这时候可以卸载重新引用
2. 核对目标框架和包版本的兼容性
别随便装最新版的包,得和你的项目目标框架匹配:
- 比如你用.NET 6,就装6.x系列的System.Drawing.Common;用.NET Framework 4.8,就对应兼容的版本
- 跨平台的包在Windows上有时候会有适配问题,你这是用OpenFileDialog(Windows专属组件),一定要选Windows环境下稳定的版本
3. 微调STA线程的写法(虽然你已经设置了,但细节可能出问题)
你当前的线程代码逻辑没问题,但可以试试我这个更严谨的写法,确保STA状态真的生效:
var openFileThread = new Thread(() => { Console.Title = "Low Pixel | Loading Combos..."; using (var dialog = new OpenFileDialog()) { dialog.Title = "Load Combo List"; dialog.Filter = "Text Files |*.txt"; dialog.RestoreDirectory = true; if (dialog.ShowDialog() == DialogResult.OK) { Checker.Combo = new ConcurrentQueue<string>(File.ReadAllLines(dialog.FileName)); Console.WriteLineFormatted("Successfully loaded {0} lines of combos", Color.Aqua, Color.LightBlue, new object[] { Checker.Combo.Count() }); Thread.Sleep(2500); } } }); openFileThread.SetApartmentState(ApartmentState.STA); openFileThread.Start(); openFileThread.Join();
另外,别忘了给你的主程序入口(Main方法)加上[STAThread]特性,虽然你是在单独线程里开对话框,但主线程的公寓状态有时候也会间接影响UI组件的初始化,加了没坏处。
4. 检查程序集的「复制本地」设置
如果是.NET Framework项目,右键引用的System.Drawing程序集,看属性里的复制本地是不是设为True。要是设成False,运行时可能找不到对应的dll文件,就会报加载失败的错。
5. 排查系统环境的问题
- 确保你的Windows系统装了对应版本的.NET运行时,比如你项目用.NET 6,就得装.NET 6桌面运行时
- 有时候系统缺少GDI+相关组件也会导致System.Drawing.Common加载失败,你可以试试修复.NET运行时,或者给系统打个最新补丁
先从第一步的NuGet包检查开始,这是最容易解决的,大概率能搞定你的问题。
内容的提问来源于stack exchange,提问作者Mody
相关产品推荐
相关产品推荐

