MSB3021错误:编译时无法复制DLL文件,提示访问被拒绝
问题场景
反编译修改西门子Simatic Portal V15.1的Siemens.Simatic.Hwcn.Basics.dll库,配置的csproj文件如下:
<PropertyGroup> <AssemblyName>Siemens.Simatic.Hwcn.Basics</AssemblyName> <GenerateAssemblyInfo>False</GenerateAssemblyInfo> <UseWindowsForms>True</UseWindowsForms> <TargetFramework>net461</TargetFramework> <PlatformTarget>x64</PlatformTarget> <UseCommonOutputDirectory>true</UseCommonOutputDirectory> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> </PropertyGroup> <PropertyGroup> <LangVersion>7</LangVersion> <AllowUnsafeBlocks>True</AllowUnsafeBlocks> </PropertyGroup> <PropertyGroup> <RootNamespace /> <OutputPath>C:\Program Files\Siemens\Automation\Portal V15_1\Bin</OutputPath> </PropertyGroup>
编译时触发错误:无法将文件"obj\Debug\Siemens.Simatic.Hwcn.Basics.dll"复制到"C:\Program Files\Siemens\Automation\Portal V15_1\Bin\Siemens.Simatic.Hwcn.Basics.dll",进程无法访问该文件
解决方案
终止占用目标DLL的进程
目标DLL属于Simatic Portal组件,先彻底关闭Portal主程序,再打开任务管理器,检查并结束所有带Simatic或Portal标识的后台进程(比如Siemens.Simatic.Portal.exe、关联服务进程)。也可以用Windows资源监视器,搜索Siemens.Simatic.Hwcn.Basics.dll,定位占用进程后直接终止。临时修改输出路径,编译后手动复制
C:\Program Files是系统受保护目录,直接输出易触发权限或占用问题。修改csproj的OutputPath到普通目录(比如C:\Temp\PortalBin),编译完成后,手动将生成的DLL复制到目标目录(复制前确保Portal未运行)。修改后的配置示例:<PropertyGroup> <RootNamespace /> <OutputPath>C:\Temp\PortalBin</OutputPath> </PropertyGroup>以管理员身份运行Visual Studio
系统保护目录的写入需要管理员权限,右键Visual Studio图标选择「以管理员身份运行」,再重新编译解决方案,避免权限不足导致的文件写入失败。排查安全软件拦截
部分杀毒软件或系统安全工具会监控系统目录的文件修改,可能锁定了原DLL。临时关闭实时防护功能,再尝试编译操作。清理项目后重新生成
在Visual Studio中执行「生成」→「清理解决方案」,手动删除项目的obj和bin目录,清除残留编译文件后,再重新生成解决方案。
内容的提问来源于stack exchange,提问作者Roman Nichi

