C#生成的PDB文件被占用无法删除的问题求助
问题描述
我们的程序通过代码从数据库生成.dll和.pdb文件,特定设置下需每隔几分钟重建程序集并清理文件夹后重新创建文件。该操作已运行多年,近期突然无法删除.pdb文件,报错:
System.UnauthorizedAccessException: Access to the path 'Sym.pdb' is denied.
程序运行时手动删除也失败,停止调试后可正常删除,当前并未调试生成的.dll或主动使用.pdb。已做以下尝试但无效:
- 设置文件属性为Normal:
fileName.Attributes = FileAttributes.Normal; - 取消勾选VS选项:
Tools -> Options -> Debugging -> General -> Enable Diagnostic Tools while debugging
问题在多台设备及VS2017环境中出现,求解决建议。
解决建议
- 排查进程占用:在命令行执行
tasklist /m Sym.pdb,查询哪个进程锁定了文件——大概率是VS后台进程(如msbuild.exe、vshost.exe残留)、Windows Defender实时扫描或第三方杀毒软件。找到进程后手动终止测试,若有效,可在程序重建前自动终止对应进程,或把目标文件夹加入杀毒软件的实时扫描排除列表。 - 添加删除重试逻辑:在删除代码里加入延迟重试机制,避免文件释放不及时导致的锁定。示例代码:
int retryTimes = 3; while (retryTimes > 0) { try { File.Delete("Sym.pdb"); break; } catch (UnauthorizedAccessException) { retryTimes--; System.Threading.Thread.Sleep(1000); } }
- 检查程序集加载状态:确认生成的
.dll是否被当前程序或其他进程加载(哪怕没主动调试,反射等操作也可能加载程序集,关联锁定.pdb)。用AppDomain.CurrentDomain.GetAssemblies()遍历已加载程序集,若包含目标.dll,需通过独立AppDomain加载并卸载(当前域的程序集无法直接卸载)。 - 调整VS调试相关设置:除关闭诊断工具外,尝试关闭以下选项:
Tools -> Options -> Debugging -> General -> Enable Just My CodeTools -> Options -> Debugging -> General -> Enable .NET Framework source stepping
同时把Tools -> Options -> Projects and Solutions -> Build and Run里的MSBuild project build output verbosity设为Detailed,查看构建日志里的文件锁定相关信息。
- 清理VS缓存与项目文件:删除VS临时缓存(路径一般为
C:\Users\<用户名>\AppData\Local\Microsoft\VisualStudio\15.0_<随机串>\ComponentModelCache),清空项目的bin、obj文件夹,重启VS后测试。 - 检查文件夹权限:确认目标文件夹的权限设置是否正常,是否近期有组策略修改导致当前用户删除权限受限。右键文件夹→属性→安全→高级,确保运行程序的用户拥有完全控制权限。
- 禁用VS后台编译:打开
Tools -> Options -> Projects and Solutions -> Build and Run,将On Run, when projects are out of date设为Always build,取消勾选Allow parallel project builds,避免后台编译进程锁定文件。
内容的提问来源于stack exchange,提问作者Igavshne
相关产品推荐
相关产品推荐

