Visual Studio指定移除文件无效,迁移csproj遇依赖DLL难题
问题原因
- 你用的
<Content Remove>只对项目里标记为Content类型的文件管用,但这些冗余DLL是NuGet包依赖的输出文件——它们是NuGet解析依赖后自动复制到输出目录的,根本不属于项目自身的Content项,所以这个配置完全起不了作用。 <EnableDefaultItems>false</EnableDefaultItems>是用来关闭项目对本地文件的默认包含规则(比如自动把文件夹里的cs、dll文件加到项目里),但和NuGet包往输出目录复制依赖文件完全无关,当然没用。
解决办法
针对.NET Framework目标的新式csproj,要排除NuGet带来的冗余DLL,试试这几种实用方法:
1. 精准排除特定NuGet包的资产
如果知道这个冗余DLL来自某个具体的NuGet包,直接在对应的PackageReference里加ExcludeAssets属性:
<PackageReference Include="你的目标包名" Version="对应版本号"> <!-- 如果是原生类DLL,用native;如果是运行时DLL,用runtime --> <ExcludeAssets>native</ExcludeAssets> <!-- 要是想更精准,直接指定单个文件 --> <!-- <ExcludeAssets>native/concrt140.dll</ExcludeAssets> --> </PackageReference>
ExcludeAssets可选值有compile、runtime、native、contentfiles这些,根据DLL类型选对应的就行。
2. 编译后自动删除输出目录的冗余文件
要是不知道DLL来自哪个包,或者需要全局排除,就给项目加个Target,在编译完成后删掉指定文件:
<Target Name="CleanupRedundantDlls" AfterTargets="CopyFilesToOutputDirectory"> <Delete Files="$(OutputPath)concrt140.dll" /> <!-- 要是有x86/x64子目录的版本,也一起删 --> <!-- <Delete Files="$(OutputPath)x86\concrt140.dll" /> --> </Target>
这个目标会在所有文件复制到输出目录后,自动删掉你指定的DLL。
3. 全局禁用NuGet包的本地复制(慎用)
如果这些DLL是VC++运行时这类系统级依赖,你可以直接关闭NuGet包的本地复制:
<PropertyGroup> <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies> </PropertyGroup>
注意:这个设置会影响所有NuGet包的文件复制,要是你只需要排除个别文件,优先用前两种方法。
内容的提问来源于stack exchange,提问作者Jaxel Rojas
相关产品推荐
相关产品推荐

