如何排除NuGet包附带的x64 dll文件输出到项目输出目录?
解决方案
以下方案均通过修改项目配置实现,无需使用后期生成事件删除文件。
方案1:直接过滤x64版本的原生dll
在项目.csproj文件的ItemGroup节点中添加排除规则,直接阻止x64版本dll被拷贝到输出目录:
<ItemGroup> <!-- 原有PackageReference配置保持不变 --> <Content Remove="$(NuGetPackageRoot)grpc.core\*\runtimes\win-x64\native\grpc_csharp_ext.x64.dll" /> <None Remove="$(NuGetPackageRoot)grpc.core\*\runtimes\win-x64\native\grpc_csharp_ext.x64.dll" /> </ItemGroup>
如果需要适配动态的平台配置,也可以用条件过滤规则自动匹配当前生成架构:
<ItemGroup> <NativeLibs Remove="%(NativeLibs.Identity)" Condition="$([System.String]::Copy('%(NativeLibs.FileName)').Contains('x64'))" /> </ItemGroup>
方案2:显式指定运行时标识符
如果项目仅需在x86 Windows环境运行,直接在.csproj的PropertyGroup节点中指定运行时标识,构建系统会自动过滤所有非目标架构的原生资产:
<PropertyGroup> <!-- 单架构场景 --> <RuntimeIdentifier>win-x86</RuntimeIdentifier> </PropertyGroup>
如果需要兼容多架构但仅排除x64,也可以配置复数形式的运行时标识列表,仅保留需要的架构:
<PropertyGroup> <RuntimeIdentifiers>win-x86;linux-x86</RuntimeIdentifiers> </PropertyGroup>
方案3:禁用自动拷贝逻辑后手动引入需要的dll
Grpc.Core包内置了Grpc_CopyNative开关,可以关闭默认的原生dll拷贝逻辑,之后手动引入你需要的x86版本dll即可:
<PropertyGroup> <Grpc_CopyNative>false</Grpc_CopyNative> </PropertyGroup> <ItemGroup> <Content Include="$(NuGetPackageRoot)grpc.core\*\runtimes\win-x86\native\grpc_csharp_ext.x86.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <Link>grpc_csharp_ext.x86.dll</Link> </Content> </ItemGroup>
上述配置对直接依赖
Grpc.Core或间接依赖Grpc.Core的项目都生效,Grpc_CopyNative是Grpc官方包内置的配置项,兼容性稳定。
内容的提问来源于stack exchange,提问作者maxp
相关产品推荐
相关产品推荐

