Файл активов obj project.assets.json не имеет целевого значения «.NetFramework, версия =v4.8 / win7-x86» (NETSDK1047)

#vb.net #visual-studio-2019 #project

#vb.net #visual-studio-2019 #проект

Вопрос:

После обновления файлов моего проекта до нового формата файла проекта, мой исполняемый клиентский проект ( .exe ) выдает ошибку при компиляции с msbuild :

ошибка NETSDK1047: файл активов obj project.assets.json не имеет целевого «.NetFramework, версия =v4.8 / win7-x86». Убедитесь, что восстановление было выполнено и что вы включили «net48» в TargetFrameworks для вашего проекта. Возможно, вам также придется включить «win7-x86» в идентификаторы RuntimeIdentifiers вашего проекта.

Я обновляю множество проектов, но только исполняемый клиентский проект создает некоторые проблемы, остальные работают нормально.

Старый .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 Filesdotnetsdk3.1.401SdksMicrosoft.NET.SdktargetsMicrosoft.PackageDependencyResolution.targets(241,5) )

  • Я восстанавливаю зависимости моего решения и пакеты с помощью nuget restore my.sln

Итак, что я могу здесь сделать? 🙁

Комментарии:

1. На моем месте я бы создал новый проект и наращивал его шаг за шагом, чтобы он напоминал старый, пока я не смог бы определить, что отличается.

2. github.com/dotnet/sdk/issues/1321

3. удалите папки obj / bin и повторите попытку

4. следующий порядок сборки помогает мне: git clean -xfd , nuget restore $sln , dotnet restore $sln , msbuild $sln

5. предположительно, вы это поняли. пожалуйста, опубликуйте свой вывод в ответе

Ответ №1:

Всем, кто попадает сюда из Google, я отследил проблему в NuGetRestore задаче сообщества MSBuild. Это то, что мы делали для восстановления пакетов:

 <Target Name="Restore">
  <NuGetRestore Solution="TestApp.sln"/>
</Target>
  

Вместо того, чтобы использовать это, я позволяю задаче MSBuild самой выполнять восстановление:

 <Target Name="BuildSolution">
  <MSBuild Projects="TestApp.sln" Properties="Platform=x64" Targets="Restore;Build" />
</Target>
  

Обратите внимание на целевые объекты. Я думаю, что эта проблема обнаружилась, как только мы начали смешивать форматы файлов проекта csproj в стиле SDK и старом стиле.

Ответ №2:

На моей машине все нормально строится. Почему не мой конвейер 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.CryptoRoss.Utilities.Crypto.csproj" />
  </ItemGroup>

</Project>
  

Я просмотрел свой конвейер Azure CI и понял, что он нацелен на BuildConfiguration of Release — поэтому я добавил новую группу свойств, чтобы я мог правильно настроить таргетинг 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.CryptoRoss.Utilities.Crypto.csproj" />
  </ItemGroup>

</Project>
  

Теперь у меня все хорошо!!!

Ответ №3:

действительно, у меня проблема с момента перехода на SDK в стиле csproj: мое решение смешано со старым устаревшим и новым стилем SDK csproj.

мое решение таково: установите версию sdk, которую вам нужно загрузить nuget.exe https://learn.microsoft.com/en-us/nuget/install-nuget-client-tools

запустите 2 восстановления последовательно:

 nuget restore  $PROJECT_NAME.sln -ConfigFile ${CI_COMMON_DIR}NuGet.Config 
dotnet restore  $PROJECT_NAME.sln