Мульти-таргетинг .net core 2.2 с .net 4.6.1 - PullRequest
1 голос
/ 02 октября 2019

Некоторое время назад я запустил приложение для сбора данных с метеорологических станций и для его кроссплатформенности я использовал .net core 2.2 mvc вместе с некоторыми библиотеками. Несмотря на то, что данные сохраняются в базе данных mysql, клиент недавно запросил, чтобы выбранные записи метео из списка были сохранены в базе данных локального доступа. Чтобы добиться этого, мне пришлось использовать законного поставщика базы данных от Microsoft, который в данном случае EntityFrameworkCore.Jet . Я не знал, что сначала возникла проблема с совместимостью, в результате которой

Could not load type 'System.Data.OleDb.OleDbConnection' from assembly 'System.Data,

в этой части кода:

var msAccessDb = _msAccessRepo.InitializeDatabaseContext(connectionString);
msAccessDb.Database.OpenConnection();

Теперь дело доходит до того, что у меня естьсделать несколько нацеливания на мои файлы .csproj. Какой синтаксис я должен написать? Первое, что мне нужно сделать, это обновить файл .csproj следующим образом:

<TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>

Но все мои пакеты, такие как automapper, Pomelo.EntityFrameworkCore.MySql, инструменты Entity Framework, NLog, компилируются под netcoreapp2. 2 рамки. Я получаю всевозможные ошибки, в основном CS0234 и CS234, даже с условием внутри XML-части Itemgroup, например:

  <PropertyGroup>
    <TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>    
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.2'">
    <PackageReference Include="AutoMapper" Version="9.0.0" />
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
    <PackageReference Include="EntityFrameworkCore.Jet" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
    <PackageReference Include="MySql.Data" Version="8.0.17" />
    <PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.17" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0" />
    <PackageReference Include="System.Drawing.Common" Version="4.6.0" />
</ItemGroup>

Должен ли я понизить версию своего приложения и перейти с .net core на .net framework? Или я делаю что-то не так в своей многоцелевой ориентации?

Заранее благодарю за помощь.

[ РЕДАКТИРОВАТЬ ]

На основеответ ниже, мой файл Project.Web.csproj выглядит следующим образом:

   <PropertyGroup>
    <TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>
    <UserSecretsId>aspnet-myProject.Web-BBF62A3C-EE9E-4808-8924-F2BEA33CDBD6</UserSecretsId>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Drawing.Common" Version="4.6.0" />
  </ItemGroup>

  <ItemGroup  Condition=" '$(TargetFramework)' == 'net461'">
    <PackageReference Include="EntityFrameworkCore.Jet" Version="2.2.0" />
    <PackageReference Include="System.Data.OleDb" Version="4.6.0" />
  </ItemGroup>

  <ItemGroup  Condition=" '$(TargetFramework)' == 'netcoreapp2.2'">
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.0"/>   
    <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0"/>    
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <PackageReference Include="AutoMapper" Version="9.0.0" />
    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
    <PackageReference Include="MySql.Data" Version="8.0.17" />
    <PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.17" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0" />
  </ItemGroup>

  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.2'">
    <ProjectReference Include="..\myProject.DB\myProject.DB.csproj" />
    <ProjectReference Include="..\myProject.Lib\myProject.Lib.csproj" />
    <ProjectReference Include="..\myProject.LoggerService\myProject.LoggerService.csproj" />
  </ItemGroup>

Конечно, он начал давать мне ошибки сборки, потому что я должен был применять условия для различных платформ, которые они применяют. Не то чтобы отдельные библиотеки внизу были только проектами .net core 2.2, и они не нацелены ни на какой другой фреймворк. Первоначально я удалил «Условие», но ошибки сборки, такие как следующие, сохраняются (до 850 ошибок).

The type or namespace name 'UserManager<>' could not be found

enter image description here

Iзнаю, что я понял что-то не так, или, может быть, .net core 2.2 не поддерживается как многоцелевой с .net framework, имеющим старую версию 4.6.

Любое дальнейшее обсуждение, чтобы решить эту проблему, или доказать, что это многоцелевоенацеливание не сработает, будет оценено.

1 Ответ

1 голос
/ 02 октября 2019

У вас есть только ссылки на пакеты для .NET Core. У вас должна быть группа элементов для каждого из следующих элементов, если они применимы:

  • Ссылки на сборки .NET Framework (с целевой платформой Condition)
  • Необходимые ссылки на пакеты Nugetдля обеих целевых платформ
  • ссылки на пакеты Nuget, необходимые только для .NET Framework (с целевой платформой Condition)
  • ссылки на пакеты Nuget, необходимые только для .NET Core (сцелевой фреймворк Condition)

Кроме того, System.Data.OleDb.OleDbConnection является , изначально недоступным в .NET Core . Вам нужно будет сослаться на пакет System.Data.OleDb Nuget.

Пожалуйста, попробуйте удалить Condition=" '$(TargetFramework)' == 'netcoreapp2.2'" из ItemGroup и добавить ссылку на пакет System.Data.OleDb.

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


Здесь, для иллюстрации, приведены ссылки на пакеты из моей библиотеки, для которой предназначен. NET Standard 2.0 и .NET 4.8:

  <ItemGroup Condition="'$(TargetFramework)'=='net48'">
    <Reference Include="System.Configuration" />
    <Reference Include="System.Data.Linq" />
    <Reference Include="System.ServiceModel" />
    <Reference Include="System.ServiceModel.Web" />
    <Reference Include="System.Web.Extensions" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
    <PackageReference Include="System.Diagnostics.EventLog" Version="4.6.0" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="JetBrains.Annotations" Version="2019.1.3" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
    <PackageReference Include="NodaTime" Version="2.4.7" />
  </ItemGroup>

Обратите внимание, как я ссылаюсь на сборки .NET Framework для платформы net48, один пакет Nuget для netstandard2.0 и три пакета Nuget для обеих целей.

...