在Visual Studio中用C# .NET Core开发JsReport遇MSB3021权限错误
我之前在使用jsreport.Local和.NET Core项目时也遇到过这个烦人的MSB3021错误,本质就是编译时无法覆盖被锁定的输出文件,下面给你几个实用的解决办法:
先干掉占用文件的进程
大概率是你之前运行的js.exe或者apphost.exe没正常退出,导致文件被锁。打开任务管理器,找到这两个进程直接结束;嫌麻烦的话,打开命令提示符(管理员模式)运行:taskkill /F /IM js.exe taskkill /F /IM apphost.exe强制终止后再重新编译试试。
用管理员身份运行Visual Studio
有时候普通权限下VS没法写入bin目录的文件,右键Visual Studio图标选「以管理员身份运行」,再编译项目。清理重建项目
先在VS里点「生成」→「清理解决方案」,然后再「重新生成解决方案」。也可以手动删掉项目根目录下的bin和obj文件夹,彻底清除旧的输出文件,避免残留锁定。检查输出目录权限
右键你的项目输出目录(比如C:\Users\jmodiba\source\repos\js\js\bin\Debug\net6.0),选「属性」→「安全」,确保当前用户有「写入」权限。如果没有,点「编辑」添加写入权限。调整jsreport初始化代码
有时候AsUtility()模式会和.NET Core的宿主进程冲突,你可以试试去掉这个方法:using jsreport.Binary; using jsreport.Local; using jsreport.Types; var rs = new LocalReporting().UseBinary(JsReportBinary.GetBinary()).Create(); await rs.RenderAsync(new RenderRequest() { Template = new Template() { Recipe = Recipe.ChromePdf, Engine = Engine.None, Content = "Hello from pdf" } });或者指定一个独立的工作目录,避免和项目输出目录抢文件:
using System.IO; using jsreport.Binary; using jsreport.Local; using jsreport.Types; var workDir = Path.Combine(Environment.CurrentDirectory, "jsreport-work"); Directory.CreateDirectory(workDir); var rs = new LocalReporting() .UseBinary(JsReportBinary.GetBinary()) .SetWorkingDirectory(workDir) .Create(); await rs.RenderAsync(new RenderRequest() { Template = new Template() { Recipe = Recipe.ChromePdf, Engine = Engine.None, Content = "Hello from pdf" } });更新NuGet包
确保jsreport.binary和jsreport.Local是最新的稳定版本,旧版本可能和.NET 6有兼容性问题,打开NuGet包管理器更新一下试试。
如果以上都没用,那就重启电脑吧,有时候系统级的文件锁定只有重启才能彻底释放。
内容的提问来源于stack exchange,提问作者Jacob Modiba

