.NET 5.0 без TFM
От: _NN_ www.nemerleweb.com
Дата: 22.03.21 15:14
Оценка: 213 (10)
Начиная с .NET 5 для работы с Windows Forms или WPF требуется указать Target Framework Moniker
https://docs.microsoft.com/en-us/dotnet/standard/frameworks

Если программа изначально нацелена на работу с ними, то проблем нет.
Однако если мы хотим создать консольное приложение и где-то в зависимостях используется тип из System.Windows.Forms, и даже если сам класс этот не используется, нужно все проекты переводить на -windows TFM.
Результат печален, получаем лишние 60МБ, которые просто не нужны.

Решение: Вручную прописать зависимости фреймворка.
Результат: 18МБ против 81МБ без изменения кода.

Никаких хаков, всё документировано:
https://github.com/NuGet/Home/wiki/%5BSpec%5D-FrameworkReference-in-NuGet
https://github.com/dotnet/designs/blob/main/accepted/2019/targeting-packs-and-runtime-packs.md

Код:
Зависимость
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ClassLibrary2
{
    public class Class1
    {
        void F()
        {
            var f = new Form();
            f.Show();
        }
    }
}


Наша программа
class A
{
    public static void Main()
    {
    }
}


До:

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

  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>
</Project>


<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Properties\" />
  </ItemGroup>
</Project>


После:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
  </PropertyGroup>


  <ItemGroup>
    <FrameworkReference Include="Microsoft.NETCore.App" PrivateAssets="all"  />
    <FrameworkReference Include="Microsoft.WindowsDesktop.App" PrivateAssets="all"  />
  </ItemGroup>

</Project>


<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj" />
  </ItemGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.NETCore.App" PrivateAssets="all"  />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Properties\" />
  </ItemGroup>
</Project>


Посмотреть вживую: http://files.rsdn.org/16901/winforms-no-tfm.zip
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: .NET 5.0 без TFM
От: Kolesiki  
Дата: 23.03.21 12:48
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Начиная с .NET 5 для работы с Windows Forms или WPF требуется указать Target Framework Moniker

_NN>Результат печален, получаем лишние 60МБ, которые просто не нужны.

Это из серии "сломаю-ка я себе ноги! блин... а бегать-то неудобно. О, костыли!". Зачем вообще переходить на сырое, недописанное поделие "хипстеры хотят многоплатформочку", вместо того, чтобы спокойно писать на .NET FW??
Или кто-то до сих пор думает, что "писать под Линукс" — это круто??
Re[2]: .NET 5.0 без TFM
От: _NN_ www.nemerleweb.com
Дата: 23.03.21 13:20
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Это из серии "сломаю-ка я себе ноги! блин... а бегать-то неудобно. О, костыли!". Зачем вообще переходить на сырое, недописанное поделие "хипстеры хотят многоплатформочку", вместо того, чтобы спокойно писать на .NET FW??

K>Или кто-то до сих пор думает, что "писать под Линукс" — это круто??

Как бы звучало это не банально, но таки да мы портировали на Мак и Линукс и прекрасно с этим работаем.

У .NET FW тоже не всё идеально.
Для начала если нужна Windows 7, то ограничиваемся 3.5 или заставляем клиентов ставить новее.
Клиенты очень недовольны.
Либо требуем не менее 4.0 , что также довольно старая версия.
Или уже требуем установки более новой, и получаем ещё больше воплей.
Кроме того, некоторые убирают .NET FW в целях безопасности.

В любом случае работа со старым фреймворком ещё то удовольствие.
Банальных фич не хватает.

В общем тут надо смотреть требования, а дальше решать, что готовы принести в жертву
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: .NET 5.0 без TFM
От: VladCore  
Дата: 23.03.21 22:28
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Начиная с .NET 5 для работы с Windows Forms или WPF требуется указать Target Framework Moniker

_NN>https://docs.microsoft.com/en-us/dotnet/standard/frameworks

В Core 6 Preview уже есть WPF & Winforms для ARM64.

Будет урезанный вариант работать?
Re[2]: .NET 5.0 без TFM
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 24.03.21 05:25
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>В Core 6 Preview уже есть WPF & Winforms для ARM64.

VC>Будет урезанный вариант работать?

В смысле — можно просто собрать? Я просто не могу вспомнить — какая сейчас есть живая версия Windows под ARM, кроме какой-то хитрой Embedded (которая на Raspberry Pi работала).
Re[2]: .NET 5.0 без TFM
От: _NN_ www.nemerleweb.com
Дата: 24.03.21 05:58
Оценка:
VC>В Core 6 Preview уже есть WPF & Winforms для ARM64.

VC>Будет урезанный вариант работать?


Это не имеет отношения к платформе.
Работать всё будет так же.
Следует учесть, что у меня рассматривается довольно специфический случай когда есть консольное приложение, зависимое от библиотеки собранной с windows TFM, но в итоге ничего из Windows Forms не используется.
По хорошему dotnet должен был разрулить это сам, но не смог.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: .NET 5.0 без TFM
От: VladCore  
Дата: 24.03.21 08:34
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

VC>>В Core 6 Preview уже есть WPF & Winforms для ARM64.

VC>>Будет урезанный вариант работать?

МР>В смысле — можно просто собрать? Я просто не могу вспомнить — какая сейчас есть живая версия Windows под ARM, кроме какой-то хитрой Embedded (которая на Raspberry Pi работала).


Обычная десятка. С мышкой, клвавой и магазином приложений) эмулятор AMD64 кстати майкрософт для нее за несколько месяцев до Эппла выкатила. С поддержкой h/w акселерации графики.
Re[4]: .NET 5.0 без TFM
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 24.03.21 08:47
Оценка:
Здравствуйте, VladCore, Вы писали:

МР>>В смысле — можно просто собрать? Я просто не могу вспомнить — какая сейчас есть живая версия Windows под ARM, кроме какой-то хитрой Embedded (которая на Raspberry Pi работала).


VC>Обычная десятка. С мышкой, клвавой и магазином приложений) эмулятор AMD64 кстати майкрософт для нее за несколько месяцев до Эппла выкатила. С поддержкой h/w акселерации графики.

Это типа для ноутбуков на ARM?
Re[5]: .NET 5.0 без TFM
От: VladCore  
Дата: 24.03.21 08:51
Оценка: 8 (1)
Здравствуйте, Михаил Романов, Вы писали:

VC>>Обычная десятка. С мышкой, клвавой и магазином приложений) эмулятор AMD64 кстати майкрософт для нее за несколько месяцев до Эппла выкатила. С поддержкой h/w акселерации графики.

МР>Это типа для ноутбуков на ARM?

на слуху это Surface Pro X только. Есть ли другие ноуты я не слышал.
Re[3]: .NET 5.0 без TFM
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.03.21 10:10
Оценка: 8 (1)
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, VladCore, Вы писали:


VC>>В Core 6 Preview уже есть WPF & Winforms для ARM64.

VC>>Будет урезанный вариант работать?

МР>В смысле — можно просто собрать? Я просто не могу вспомнить — какая сейчас есть живая версия Windows под ARM, кроме какой-то хитрой Embedded (которая на Raspberry Pi работала).

Скачать Windows 10X теперь может любой желающий — почти финальная сборка ОС утекла в Сеть

Microsoft добавила поддержку эмуляции x64 в Windows 10 на ARM

https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.03.2021 10:11 Serginio1 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.