You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多目标(.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构建时未正确加载配置。以下是两种修正方案:

方案一:使用统一配置(推荐,因你的两个框架配置完全一致)

  1. 保留项目根目录的FodyWeavers.xml(即你已创建的配置文件)
  2. 删除.csproj中所有按目标框架拆分的ItemGroup节点(即那两个包含FodyWeavers.net7.xml和FodyWeavers.net48.xml的配置块)
  3. 无需额外配置,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>

方案二:使用差异化配置(若后续需为两个框架设置不同规则)

  1. 分别创建FodyWeavers.net48.xml和FodyWeavers.net7.0.xml,写入对应框架的Costura配置
  2. 删除.csproj中所有手动复制链接配置文件的ItemGroup节点,Fody会自动根据当前构建的目标框架加载对应名称的配置文件

额外注意事项

  • 清理项目的bin和obj目录后重新构建,避免旧缓存干扰
  • 确认Costura.Fody v5.7.0支持.NET7(官方已确认该版本兼容.NET 6+)

内容的提问来源于stack exchange,提问作者fkitsantas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:26:03