VS2022迁移至PackageReference后,Project B缺失指定传递依赖
问题:VS2022升级后PackageReference传递依赖缺失System.Runtime.CompilerServices.Unsafe
环境与项目背景
- 从VS2019升级至VS2022 17.7.5,同时将NuGet管理方式从package.config迁移到PackageReference
- 存在两个基于.NET Framework 4.8的项目:
- Project A:通过PackageReference引用以下顶级NuGet包:
- NewtonSoft.Json
- MailKit
- HtmlAgilityPack
- INIFileParserDotNetCore.Signed
这些包包含多项传递依赖,包括BouncyCastle.Cryptography、MimeKit、System.Buffers以及System.Runtime.CompilerServices.Unsafe等System系列包
- Project B:仅依赖Project A,无其他直接依赖或NuGet包
- Project A:通过PackageReference引用以下顶级NuGet包:
异常现象
- 构建Project A时,所有传递依赖均正常出现在bin目录
- 构建Project B时,唯独System.Runtime.CompilerServices.Unsafe未被复制到bin目录,其余传递依赖均正常存在,导致Project B调用Project A方法时抛出无法加载该DLL的运行时异常,且构建阶段无任何报错,Project B的引用列表中也看不到该传递依赖
- 该问题仅在升级到VS2022后出现,VS2019下完全正常
- 手动为Project B添加该依赖可临时解决问题,但不符合传递依赖自动处理的预期
已尝试的排查操作
- 移除并重装所有NuGet包,问题仍未解决
Project B的完整.csproj代码
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> <PropertyGroup> <ProjectType>Local</ProjectType> <ProductVersion>8.0.30319</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{6DC6774A-0161-45A0-9392-E19570BB30B7}</ProjectGuid> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ApplicationIcon>Resources\XXXXXXX_Icon.ico</ApplicationIcon> <AssemblyName>XXXXXXX</AssemblyName> <AssemblyOriginatorKeyFile>XXXXXXX.snk</AssemblyOriginatorKeyFile> <DelaySign>false</DelaySign> <OutputType>WinExe</OutputType> <RootNamespace>XXXXXXX</RootNamespace> <StartupObject>XXXXX.YYYYY</StartupObject> <AppDesignerFolder>Properties</AppDesignerFolder> <TargetFrameworkVersion>v4.8</TargetFrameworkVersion> <TargetFrameworkProfile> </TargetFrameworkProfile> <FileAlignment>512</FileAlignment> <IsWebBootstrapper>false</IsWebBootstrapper> <SccProjectName>SAK</SccProjectName> <SccLocalPath>SAK</SccLocalPath> <SccAuxPath>SAK</SccAuxPath> <SccProvider>SAK</SccProvider> <SignAssembly>true</SignAssembly> <PublishUrl>publish\</PublishUrl> <Install>true</Install> <InstallFrom>Disk</InstallFrom> <UpdateEnabled>false</UpdateEnabled> <UpdateMode>Foreground</UpdateMode> <UpdateInterval>7</UpdateInterval> <UpdateIntervalUnits>Days</UpdateIntervalUnits> <UpdatePeriodically>false</UpdatePeriodically> <UpdateRequired>false</UpdateRequired> <MapFileExtensions>true</MapFileExtensions> <ApplicationRevision>0</ApplicationRevision> <ApplicationVersion>1.0.0.%2a</ApplicationVersion> <UseApplicationTrust>false</UseApplicationTrust> <BootstrapperEnabled>true</BootstrapperEnabled> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <OutputPath>bin\Debug\</OutputPath> <AllowUnsafeBlocks>false</AllowUnsafeBlocks> <BaseAddress>285212672</BaseAddress> <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> <ConfigurationOverrideFile /> <DefineConstants>DEBUG;TRACE</DefineConstants> <DocumentationFile /> <DebugSymbols>true</DebugSymbols> <FileAlignment>512</FileAlignment> <Optimize>false</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> <TreatWarningsAsErrors>false</TreatWarningsAsErrors> <WarningLevel>4</WarningLevel> <DebugType>full</DebugType> <ErrorReport>prompt</ErrorReport> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <UseVSHostingProcess>true</UseVSHostingProcess> <Prefer32Bit>false</Prefer32Bit> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <OutputPath>bin\Release\</OutputPath> <AllowUnsafeBlocks>false</AllowUnsafeBlocks> <BaseAddress>285212672</BaseAddress> <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow> <ConfigurationOverrideFile /> <DefineConstants>TRACE</DefineConstants> <DocumentationFile /> <DebugSymbols>false</DebugSymbols> <FileAlignment>512</FileAlignment> <Optimize>true</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> <TreatWarningsAsErrors>false</TreatWarningsAsErrors> <WarningLevel>4</WarningLevel> <DebugType>none</DebugType> <ErrorReport>prompt</ErrorReport> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <Prefer32Bit>false</Prefer32Bit> </PropertyGroup> <ItemGroup> <Reference Include="System" /> <Reference Include="System.Data" /> <Reference Include="System.Drawing" /> <Reference Include="System.Security" /> <Reference Include="System.Windows.Forms" /> <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="XXXXXXX.cs"> <SubType>Form</SubType> </Compile> <Compile Include="Properties\Resources.Designer.cs"> <AutoGen>True</AutoGen> <DesignTime>True</DesignTime> <DependentUpon>Resources.resx</DependentUpon> </Compile> <EmbeddedResource Include="XXXXXXX.resx"> <DependentUpon>XXXXXXX.cs</DependentUpon> </EmbeddedResource> <EmbeddedResource Include="Properties\Resources.resx"> <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> </EmbeddedResource> <None Include="app.config" /> <None Include="XXXXXXX.snk" /> </ItemGroup> <ItemGroup> <BootstrapperPackage Include=".NETFramework,Version=v4.8"> <Visible>False</Visible> <ProductName>Microsoft .NET Framework 4.8 %28x86 and x64%29</ProductName> <Install>true</Install> </BootstrapperPackage> <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> <Visible>False</Visible> <ProductName>.NET Framework 3.5 SP1</ProductName> <Install>false</Install> </BootstrapperPackage> </ItemGroup> <ItemGroup> <Content Include="Resources\XXXXXXX_Icon.ico" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\ProjectA\CommonForms.csproj"> <Project>{e0c409ed-c95f-473b-9f0c-d17abf252934}</Project> <Name>CommonForms</Name> <EmbedInteropTypes>False</EmbedInteropTypes> </ProjectReference> <ProjectReference Include="..\ProjectA\CommonUtils.csproj"> <Project>{0c9d9170-37e6-4430-ae17-79ad863e4211}</Project> <Name>CommonUtils</Name> <EmbedInteropTypes>False</EmbedInteropTypes> </ProjectReference> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <PropertyGroup> <PostBuildEvent>xcopy "$(ProjectDir)..\Other Stuff\*.exe" $(TargetDir) /Y xcopy "$(ProjectDir)..\Other Stuff\*.bat" $(TargetDir) /Y</PostBuildEvent> </PropertyGroup> </Project>
内容的提问来源于stack exchange,提问作者rboy
相关产品推荐
相关产品推荐

