NU1201项目在多框架控制台应用程序引用.NET Core DLL时与net472不兼容

4

我正在尝试制作一个控制台应用程序,以解决这里的问题。

我已经将源代码放在Git Hub上。

控制台应用程序项目文件为:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\mopcore\MopCore.csproj" />
    <ProjectReference Include="..\MopFW\MopFW.csproj" />
  </ItemGroup>
</Project>

Program.cs is

using System;
using System.Linq;
using MopCore;
using MopFW;  // error shows here
namespace ConsoleAppCore2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            CountMopsCore();
            CountMopsFramework();
        }

        private static void CountMopsCore()
        {
            Console.WriteLine($"Hi");
            using (var context = new MopContext())
            {
                var num = context.Mops.Count();
                Console.WriteLine($"There are {num} mops \r\n providern {context.Database.ProviderName}");
            }
            Console.ReadKey();
        }

        private static void CountMopsFramework()
        {
            Console.WriteLine($"Hi");
            using (var context = new MopFW.MopContext())
            {
                var num = context.Mops.Count();
                Console.WriteLine($"There are {num} mops \r\n in {context.Database.Connection.ConnectionString}");
            }
            Console.ReadKey();
        }
    }
}

netcoreapp3.1项目文件是什么

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AssemblyName>MopCore</AssemblyName>
    <RootNamespace>MopCore</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.4" />
  </ItemGroup>
</Project>

框架项目文件是

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="EntityFramework" Version="6.4.4" />
  </ItemGroup>
</Project>

我遇到编译错误。

Error   NU1201  Project MopCore is not compatible with net472 (.NETFramework,Version=v4.7.2). Project MopCore supports: netcoreapp3.1 (.NETCoreApp,Version=v3.1)    ConsoleAppCore2 C:\Users\kirst\source\repos\MopData\ConsoleAppCore2\ConsoleAppCore2.csproj  1   

[更新] 我知道最好的方法是使用.netstandard。
但是我想探索一下如何让.netcore和.net472一起工作。
在将控制台项目更正为
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>
  </PropertyGroup>
    <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">
        <ProjectReference Include="..\mopcore\MopCore.csproj" />
    </ItemGroup>
    <ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
        <ProjectReference Include="..\MopFW\MopFW.csproj" />
    </ItemGroup>
</Project>

我仍然在program.cs中遇到构建错误。build errors

你是想为两个平台都加载两个项目,还是每个平台只加载一个项目?在了解这些信息后,我会更新我的答案。 - Julian
当你在.NET Core版本中没有对MopFW进行引用时,你如何期望它是有效的呢?你可以使用#if指令来构建控制台应用程序中适当版本的代码。 - Jon Skeet
我肯定在理解上漏掉了一些基础知识。所以,.netcore应用程序无法调用框架库吗?我想要为核心平台加载两个项目。 - Kirsten
我认为我的错误在于尝试在控制台应用程序中使用Entity Framework。它应该留在库的dlls中。 - Kirsten
1个回答

4
你需要使用条件引用。
在你的csproj文件中:
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">
    <ProjectReference Include="..\mopcore\MopCore.csproj" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
    <ProjectReference Include="..\MopStandard\MopFW.csproj" />
</ItemGroup>

或者你需要使MopCore也兼容net472。例如,实现netstandard2.0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接