#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