资产文件obj \ project.assets.json没有目标“ .NETFramework,Version = v4.8 / win7-x86”NETSDK1047 旧的.vbproj格式仅标题:新的.vbproj格式仅标题:我尝试什么?更多信息:

问题描述

将项目文件升级new project file format后,当我使用.exe进行编译时,我的可执行客户端项目msbuild)会引发错误:>

错误NETSDK1047:资产文件obj \ project.assets.json没有 目标“ .NETFramework,Version = v4.8 / win7-x86”。确保 恢复已执行,并且您已在其中包含“ net48” 您项目的TargetFrameworks。您可能还必须包括 项目的RuntimeIdentifiers中的“ win7-x86”。

升级了很多项目,但是只有可执行客户端项目会带来一些麻烦,其余的都可以正常工作。

旧的.vbproj格式(仅标题):

我之前使用的格式如下:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" Toolsversion="4.0">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">Anycpu</Platform>
    <ProjectGuid>{1187BEA1-xxxx-43CF-xxxx-0C142F0A16FC}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <MyType>WindowsForms</MyType>
    <RootNamespace>MyNamespace</RootNamespace>
    <AssemblyName>MyAssemblyName</AssemblyName>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <OptionExplicit>On</OptionExplicit>
    <OptionCompare>Binary</OptionCompare>
    <OptionStrict>On</OptionStrict>
    <OptionInfer>On</OptionInfer>
    <ApplicationIcon>MyIcon.ico</ApplicationIcon>
    <RestorePackages>true</RestorePackages>
  </PropertyGroup>

新的.vbproj格式(仅标题):

升级为的格式如下:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <RootNamespace>MyRootNamespace</RootNamespace>
    <AssemblyName>MyAssemblyName</AssemblyName>
    <Deterministic>false</Deterministic>
    <TargetFramework>net48</TargetFramework>
    <OutputPath>$(SolutionDir)bin\$(Configuration)\</OutputPath>
    <OutputType>WinExe</OutputType>
    <ApplicationIcon>MyIcon.ico</ApplicationIcon>
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
    <OptionStrict>On</OptionStrict>
    <StartupObject>Program</StartupObject>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

我尝试什么?

  • 就像异常建议一样,我将<RuntimeIdentifier>win7-x86</RuntimeIdentifier>添加到我的可执行客户端项目中。我知道为什么编译器会在这里期望win7-x86。我正在win10机器上工作。我执行gt clean -xfd来摆脱obj文件夹,但没有任何变化,相同的例外。

  • 我使用dotnet restore my.sln代替nuget restore

更多信息:

  • 我不确定<StartupObject>Program</StartupObject><OutputType>WinExe</OutputType>的组合是否足以执行可执行的客户端项目。那是最先进的吗?

  • 一个奇怪的事情是,第一个编译工作完全正常。几次后,发生上述异常。完全重启计算机也可以解决该异常,但是每次编译后我都无法重启计算机。

  • NETSDK1047引发异常(Microsoft.PackageDependencyResolution.targets)(完整路径:C:\Program Files\dotnet\sdk\3.1.401\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(241,5)

  • 我使用nuget restore my.sln

    恢复了我的解决方案依赖性和软件包

那我该怎么办? :(

解决方法

在我的机器上构建良好。为什么不是我的 CI 管道?

因此,我通过从头开始构建,将我的小型 csproj winform 项目从旧式格式转换为 SDK 格式,但也出现了此错误。

这是我的起点:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net48;netcoreapp3.1;net50-windows</TargetFrameworks>
    <UseWindowsForms>true</UseWindowsForms>
    <ApplicationManifest>app.manifest</ApplicationManifest>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net48|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Ross.Utilities.Crypto\Ross.Utilities.Crypto.csproj" />
  </ItemGroup>

</Project>

我查看了我的 Azure CI 管道并意识到它的目标是 Release 的 BuildConfiguration - 所以我添加了一个新的 PropertyGroup 以便我可以正确地定位 Release|net48|AnyCPU

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net48;netcoreapp3.1;net50-windows</TargetFrameworks>
    <UseWindowsForms>true</UseWindowsForms>
    <ApplicationManifest>app.manifest</ApplicationManifest>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net48|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net48|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Ross.Utilities.Crypto\Ross.Utilities.Crypto.csproj" />
  </ItemGroup>

</Project>

现在我一切都好了!!!