多目标 .net core 2.2 与 .net 4.6.1
Multi-targeting .net core 2.2 with .net 4.6.1
我已经开始开发一个从气象站收集数据的应用程序,为了让它跨平台,我使用了 .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,即使在 Itemgroup xml 部分中的条件也是如此:
<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 核心更改为 .net 框架吗?还是我的多目标定位有问题?
预先感谢您的帮助。
[编辑]
根据下面的回答,我的 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 项目,它们不针对任何其他框架。最初我删除了 'Condition' 但构建错误仍然存在(多达 850 个错误)。
The type or namespace name 'UserManager<>' could not be found
我知道我理解错了,或者 .net core 2.2 不支持与 .net 框架 4.6 一样的多目标。
任何进一步的讨论来解决这个问题,或者证明这个多目标不会起作用,我们将不胜感激。
您只有 .NET Core 的包引用。如果适用,您应该为以下各项设置一个项目组:
- .NET Framework 程序集引用(带有目标框架
Condition
)
- 两个目标框架都需要的 Nuget 包引用
- 仅 .NET Framework 需要的 Nuget 包引用(带有目标框架
Condition
)
- 仅 .NET Core 需要的 Nuget 包引用(带有目标框架
Condition
)
此外,System.Data.OleDb.OleDbConnection
是 . You will need to reference the System.Data.OleDb Nuget 包。
请尝试从 ItemGroup
中删除 Condition=" '$(TargetFramework)' == 'netcoreapp2.2'"
并添加对包 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>
请注意我如何为框架 net48
引用 .NET Framework 程序集,为 netstandard2.0
引用一个 Nuget 包,为两个目标引用 3 个 Nuget 包。
我还没有理解一个项目中的多目标是如何工作的,所以对我有用的是在一个单独的 webapi 项目中创建特定的(访问数据库的连接)功能,目标是 .净 4.8。控制器通过 httpClient 在内部调用 web api 方法并完成工作。
我知道这并不理想,但对于我们的时间限制,这是一个很好的解决方案。
我已经开始开发一个从气象站收集数据的应用程序,为了让它跨平台,我使用了 .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,即使在 Itemgroup xml 部分中的条件也是如此:
<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 核心更改为 .net 框架吗?还是我的多目标定位有问题?
预先感谢您的帮助。
[编辑]
根据下面的回答,我的 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 项目,它们不针对任何其他框架。最初我删除了 'Condition' 但构建错误仍然存在(多达 850 个错误)。
The type or namespace name 'UserManager<>' could not be found
我知道我理解错了,或者 .net core 2.2 不支持与 .net 框架 4.6 一样的多目标。
任何进一步的讨论来解决这个问题,或者证明这个多目标不会起作用,我们将不胜感激。
您只有 .NET Core 的包引用。如果适用,您应该为以下各项设置一个项目组:
- .NET Framework 程序集引用(带有目标框架
Condition
) - 两个目标框架都需要的 Nuget 包引用
- 仅 .NET Framework 需要的 Nuget 包引用(带有目标框架
Condition
) - 仅 .NET Core 需要的 Nuget 包引用(带有目标框架
Condition
)
此外,System.Data.OleDb.OleDbConnection
是
请尝试从 ItemGroup
中删除 Condition=" '$(TargetFramework)' == 'netcoreapp2.2'"
并添加对包 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>
请注意我如何为框架 net48
引用 .NET Framework 程序集,为 netstandard2.0
引用一个 Nuget 包,为两个目标引用 3 个 Nuget 包。
我还没有理解一个项目中的多目标是如何工作的,所以对我有用的是在一个单独的 webapi 项目中创建特定的(访问数据库的连接)功能,目标是 .净 4.8。控制器通过 httpClient 在内部调用 web api 方法并完成工作。 我知道这并不理想,但对于我们的时间限制,这是一个很好的解决方案。