如何在多目标(.NET4.8/.NET7)兼容依赖项目中配置Costura.Fody?
问题:多目标框架(.NET4.8 + .NET7)下Costura.Fody仅对.NET4.8生效
我正在开发同时面向.NET Framework 4.8和.NET7的类库,代码及依赖均兼容两个目标框架,但Costura.Fody配置出现问题:单目标.NET7时可用的配置,现在仅对.NET Framework 4.8生效——.NET4.8输出目录已正确嵌入依赖DLL,.NET7输出目录未嵌入。
当前.csproj内容:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net48;net7.0</TargetFrameworks> <LangVersion>latest</LangVersion> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateDocumentationFile>True</GenerateDocumentationFile> </PropertyGroup> <!-- Common Package References --> <ItemGroup> <PackageReference Include="Azure.Core" Version="1.35.0" /> <PackageReference Include="Azure.Identity" Version="1.10.2" /> <PackageReference Include="Azure.Security.KeyVault.Keys" Version="4.5.0" /> <PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.5.0" /> <PackageReference Include="BouncyCastle.Cryptography" Version="2.2.1" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" /> <PackageReference Include="Microsoft.Identity.Client" Version="4.56.0" /> <PackageReference Include="Microsoft.IdentityModel.Abstractions" Version="7.0.3" /> <PackageReference Include="System.Memory.Data" Version="7.0.0" /> <PackageReference Include="Fody" Version="6.8.0" PrivateAssets="all" /> <PackageReference Include="Costura.Fody" Version="5.7.0" PrivateAssets="all" /> </ItemGroup> <!-- FodyWeavers Configuration --> <ItemGroup Condition="'$(TargetFramework)'=='net7.0'"> <None Include="FodyWeavers.net7.xml"> <Link>FodyWeavers.xml</Link> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> <ItemGroup Condition="'$(TargetFramework)'=='net48'"> <None Include="FodyWeavers.net48.xml"> <Link>FodyWeavers.xml</Link> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> </Project>
我创建的Costura.Fody配置文件内容:
<?xml version="1.0" encoding="utf-8" ?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <Costura LoadAtModuleInit="true"> <IncludeAssemblies> Azure.Identity Azure.Security.KeyVault.Keys Azure.Security.KeyVault.Secrets Azure.Core Microsoft.Extensions.Configuration Microsoft.Identity.Client Microsoft.IdentityModel.Abstractions System.Memory.Data BouncyCastle.Cryptography </IncludeAssemblies> </Costura> </Weavers>
解决方案
问题根源是手动按框架复制并链接配置文件的方式,干扰了Fody的自动框架识别逻辑,导致.NET7构建时未正确加载配置。以下是两种修正方案:
方案一:使用统一配置(推荐,因你的两个框架配置完全一致)
- 保留项目根目录的
FodyWeavers.xml(即你已创建的配置文件) - 删除.csproj中所有按目标框架拆分的
ItemGroup节点(即那两个包含FodyWeavers.net7.xml和FodyWeavers.net48.xml的配置块) - 无需额外配置,Fody会在编译时自动读取根目录的配置文件
修改后的完整.csproj:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net48;net7.0</TargetFrameworks> <LangVersion>latest</LangVersion> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateDocumentationFile>True</GenerateDocumentationFile> </PropertyGroup> <!-- Common Package References --> <ItemGroup> <PackageReference Include="Azure.Core" Version="1.35.0" /> <PackageReference Include="Azure.Identity" Version="1.10.2" /> <PackageReference Include="Azure.Security.KeyVault.Keys" Version="4.5.0" /> <PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.5.0" /> <PackageReference Include="BouncyCastle.Cryptography" Version="2.2.1" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" /> <PackageReference Include="Microsoft.Identity.Client" Version="4.56.0" /> <PackageReference Include="Microsoft.IdentityModel.Abstractions" Version="7.0.3" /> <PackageReference Include="System.Memory.Data" Version="7.0.0" /> <PackageReference Include="Fody" Version="6.8.0" PrivateAssets="all" /> <PackageReference Include="Costura.Fody" Version="5.7.0" PrivateAssets="all" /> </ItemGroup> </Project>
方案二:使用差异化配置(若后续需为两个框架设置不同规则)
- 分别创建
FodyWeavers.net48.xml和FodyWeavers.net7.0.xml,写入对应框架的Costura配置 - 删除.csproj中所有手动复制链接配置文件的
ItemGroup节点,Fody会自动根据当前构建的目标框架加载对应名称的配置文件
额外注意事项
- 清理项目的
bin和obj目录后重新构建,避免旧缓存干扰 - 确认Costura.Fody v5.7.0支持.NET7(官方已确认该版本兼容.NET 6+)
内容的提问来源于stack exchange,提问作者fkitsantas
相关产品推荐
相关产品推荐

