Создание приложения WinForms C# с Docker. NET Образ ядра приводит к ошибке: .NETFramework, версия = v4.6.1 не найдены - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь построить проект C#, используя WinForms (если это поможет), под GNU / Linux, используя Docker и. NET Core Docker image, как объяснено в документации . Отказ от ответственности: я не являюсь экспертом в C# или. NET.

Мой проект структурирован так:

.
├── MyProject.sln
└── MyProject
│   ├── Package1
│   |   └── ...
│   ├── Package2
│   |   └── ...
│   └── MyProject.csproj
└── MyProjectUnitTests
    ├── ...
    └── MyProjectUnitTests.csproj

В обоих .csproj файлах, целевая структура версия v4.6.1:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-->...<-->
  <PropertyGroup>
    <!-->...<-->
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
  </PropertyGroup>
</Project>

Я использую следующий Dockerfile, например в этом официальном примере :

FROM    mcr.microsoft.com/dotnet/core/sdk:3.1.201-buster

WORKDIR /app

# copy all files necessary to resolve dependencies
COPY    MyProject.sln .
COPY    MyProject/MyProject.csproj MyProject/
COPY    MyProjectUnitTests/MyProjectUnitTests.csproj MyProjectUnitTests/

# resolve dependencies
RUN     dotnet restore --verbosity normal

# copy all files
COPY    . .

RUN     dotnet build

Загрузка зависимостей работает правильно (dotnet restore), но последняя команда (dotnet build) завершилась с ошибкой:

Build FAILED.

/usr/share/dotnet/sdk/3.1.201/Microsoft.Common.CurrentVersion.targets(1177,5): error MSB3644: The reference assemblies for .NETFramework,Version=v4.6.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks [/MyProjectUnitTests/MyProjectUnitTests.csproj]
/usr/share/dotnet/sdk/3.1.201/Microsoft.Common.CurrentVersion.targets(1177,5): error MSB3644: The reference assemblies for .NETFramework,Version=v4.6.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks [/MyProject/MyProject.csproj]
    0 Warning(s)
    2 Error(s)

Я не понимаю ошибки. Ошибки перенаправляют меня на веб-сайт Microsoft, где я могу найти объяснения для загрузки и установки. NET Core 3.1.201, но именно поэтому я использую образ mcr.microsoft.com/dotnet/core/sdk:3.1.201-buster, чтобы не устанавливать его самостоятельно.

Кажется, что проект отлично работает на Windows (без Docker), но у меня нет машины Windows. Я что-то упускаю в файлах .csproj? Некоторые говорят, что я должен установить Mono, но я пытался установить пакет mono-complete и все еще получал ту же ошибку.

У кого-то есть идеи (это может быть просто небольшая ошибка, так как я не знаю. NET среда очень хорошо)?

Редактировать: сборка завершается с ошибкой. NET Образ ядра, но успешно с моно

Я забыл упомянуть об этом, но сборка внутри контейнера Docker работает с базовым образом mono:6.8.0.96 и следующий Dockerfile:

FROM    mono:6.8.0.96

WORKDIR /app

# copy all files necessary to resolve dependencies
COPY    MyProject.sln .
COPY    MyProject/MyProject.csproj MyProject/
COPY    MyProjectUnitTests/MyProjectUnitTests.csproj MyProjectUnitTests/

# resolve dependencies
RUN     nuget restore

# copy all files
COPY    . .

RUN     msbuild

Как указывалось в комментарии @LexLi, необходимо реорганизовать некоторый код (особенно вызовы API WPF, потому что Mono его не поддерживает), но сборка завершается успешно с Mono.

Чтобы избежать этого рефакторинга, я бы хотел использовать базовые образы Microsoft вместо Mono, если это возможно.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

TLDR: вы не можете создать приложение для рабочего стола для Linux, используя только материал. NET от Microsoft. Вы можете использовать Mono или сторонний стек пользовательского интерфейса.

Вы не можете создать приложение WinForms на Linux с. NET Framework или. NET Core. Чтобы понять это, вы должны понимать экосистему. NET:

Runtime

  • . NET Framework - это только Windows, и это сделано . Не ожидайте больших изменений. NET Framework. Для создания приложения на. NET Framework вы вынуждены использовать Windows

  • . NET Core - это довольно новая кроссплатформенная платформа. NET это может работать почти везде. Хотя. NET Ядро является кроссплатформенным, WPF и WinForms по-прежнему работают только на Windows.

  • Mono - альтернативная реализация с открытым исходным кодом. NET Framework, Mono включает реализацию WinForms, но, как сказал @Frank Alvaro, уже YMMV.

UI Frameworks

. NET Ядро поддерживает сборку приложений для настольных компьютеров начиная с версии 3.0 но только на Windows. Рамки пользовательского интерфейса, WinForms (Windows Forms) и WPF (Windows Presentaion Foundation) являются более или менее обертками вокруг Windows API, и в настоящее время Microsoft, похоже, не является заинтересованы в том, чтобы сделать их кроссплатформенными. К сожалению, нет официальных WinForms или WPF для Linux.

. Существуют некоторые сторонние альтернативы для. NET Core, например: Avalonia или GtkSharp .

0 голосов
/ 19 апреля 2020

Как указано @mason, вам нужно извлечь изображение, которое может использовать. NET Framework SDK. Возьмите официальный образ для. NET Framework SDK , который позволит вам dotnet restore / build ...

FROM mcr.microsoft.com/dotnet/framework/sdk:4.8

WORKDIR /app

# copy all files necessary to resolve dependencies
COPY    MyProject.sln .
COPY    MyProject/MyProject.csproj MyProject/
COPY    MyProjectUnitTests/MyProjectUnitTests.csproj MyProjectUnitTests/

# resolve dependencies
RUN     dotnet restore --verbosity normal

# copy all files
COPY    . .

# Build the app
WORKDIR /app/MyProject
RUN     dotnet build

# Uncomment to run the tests (assuming MyProjectUnitTests is a test project :-)
#WORKDIR /app/MyProjectUnitTests
#dotnet test

Есть хороший образец a. NET Framework Dockerfile здесь . YMMV с этим на Mono

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...