我的整个解决方案是否必须是.NET Framework而不是.NET Core,因为我使用的是需要.NET Framework的NuGet包?

我的整个解决方案是否必须是.NET Framework而不是.NET Core,因为我使用的是需要.NET Framework的NuGet包?,.net,.net-core,.net,.net Core,我有一个.NET核心解决方案,包括3个部分: ASP.NET核心网站 业务逻辑.NET核心DLL 数据访问.NET核心DLL 我现在需要从我的业务逻辑DLL中使用.NET Framework NuGet包(它不在我的控制范围内) 按照中的建议,我将业务逻辑项目更改为target.NET4.6.1(net461) 然而,这迫使我对数据访问项目(从业务逻辑项目中引用)做同样的事情,并且(尽管我还没有做到),我认为我也必须对网站项目做同样的事情 我认为.NET核心在很大程度上是.NET框架的一个子集,

我有一个.NET核心解决方案,包括3个部分:

  • ASP.NET核心网站
  • 业务逻辑.NET核心DLL
  • 数据访问.NET核心DLL
  • 我现在需要从我的业务逻辑DLL中使用.NET Framework NuGet包(它不在我的控制范围内)

    按照中的建议,我将业务逻辑项目更改为target.NET4.6.1(net461)

    然而,这迫使我对数据访问项目(从业务逻辑项目中引用)做同样的事情,并且(尽管我还没有做到),我认为我也必须对网站项目做同样的事情

    我认为.NET核心在很大程度上是.NET框架的一个子集,除了需要“更大”的框架之外,不会有任何功能上的变化, 那就好了。然而,在重新定位了我的数据访问项目之后,我现在发现缺少了一些东西。例如,它现在使用C#7值元组来反对我

    虽然我可以通过NuGet软件包添加回值元组,但我还需要做其他更改(DataAnnotations似乎已经消失/移动),而且我似乎正在以.NET Framework的方式重新开始做每件事


    这有什么办法吗?我觉得我就像是在拉扯一根绳子,最终回到ASP.NET MVC…

    可以同时针对这两个框架。我曾在一个项目中工作,我想将.NETCore2.0作为目标,但需要使用.NETFramework包

    为此,请打开.csproj文件,并用新的TargetFrameworks标记替换TargetFramework标记

    net461;netcoreapp2.0


    不幸的是,在VisualStudio中无法通过UI执行此操作。在您进行此更改并重新加载Visual Studio之后,您的目标框架将是空白的。

    在与@Svek聊天时,我说服自己必须放弃整个web项目,重新开始一个老式的ASP.NET MVC web项目(或割断我的手腕),现在我发现情况并非如此

    以下是我认为的要点:

  • 如果您使用的是使用.NET 4.6的NuGet软件包,则无法在以.NET Core为目标的DLL中使用该软件包

  • 您可以(按照@Matt H的回答)拥有一个针对.NET Core和.NET 4.6的DLL,但这并没有真正的帮助,因为所做的只是创建两个版本的DLL,并且只有.NET 4.6版本可以使用NuGet包。因此,您的DLL需要以.NET4.6为目标

  • 通过扩展,解决方案中直接引用该DLL的每个项目也需要以.NET4.6为目标。因此,是的,这种传染确实在蔓延-(

  • 在我的例子中,这意味着我的ASP.NET Core web应用程序也需要以.NET 4.6为目标-起初我认为这意味着完全放弃ASP.NET Core,并放弃我在web项目上所做的大量工作。然而情况并非如此

  • 可以在.NET 4.6上运行ASP.NET核心web应用程序(尽管这似乎不合逻辑)。事实上,在Visual Studio中创建新的ASP.NET核心web应用程序时,您可以选择在该点上以.NET 4.6为目标。这将生成一个不同的项目文件,其中包含额外的NuGet依赖项等。请参阅

  • 因此,我的最终解决方案是:

  • 将我的所有DLL更改为目标“net461”(通过编辑项目文件)

  • “Polyfilled”结果中缺少的一些内容(例如,通过添加NuGet包以获得ValueTuple支持,以及通过添加显式包引用以获得System.Component.DataAnnotations)

  • 围绕ASP.NET核心web项目进行黑客攻击,同时以“net461”为目标,这意味着更新各种引用并添加更多NuGet包,以使ASP.NET核心组件正常工作。(我创建了一个新的web项目的两个版本——一个是targeting.NET Core,另一个是targeting.NET 4.6,以了解两者之间的区别,以及我必须做出的更改)

  • 完成所有这些之后,我的项目可以正确编译和运行。这是一个巨大的解脱。

    另一个可能的解决方案(尽管可能不是您想要的)是将您的项目划分为更小的项目,然后业务和数据逻辑可以转换为服务(SOA-)

    这似乎是“漫长的道路”,但它确实有其最终的优势,因为分离的逻辑服务和主项目在技术和大多数其他需求方面相互独立


    我再次意识到这可能不是您想要的,但我觉得这是一个有效的选择,在这里分享可能很有用。

    我最近遇到了类似的问题……我建议您努力重新组织您的项目,以便将一个项目作为“框架桥接”(即.NET 4.6)另一个是.NET核心项目。最终您将得到两个应用程序(一个是.NET 4.6,另一个是.NET标准)@Svek:我不介意花时间把它做好,但实际上我不知道该怎么做。如果我让我的业务逻辑项目.NET 4.6,那么它就不会让数据访问项目保留为.NET核心。因此,只要我在.NET 4.6上有一个项目,整个树似乎都被“污染”了.这里是我的一个小想法,我的意思是你现在可以扩展和成长(我会在有时间的时候写一个答案)。使用.NET标准创建一个项目(仔细阅读)然后在项目中创建一个名为Foo的对象,并提供两个基本属性。此项目必须与提取任何非NET标准的依赖项保持隔离。您可以在.NET Core和.NET Framework中引用此对象…让我们使用API(如web API)并传递此对象(Foo)在两个应用程序之间。因此我们有2个应用程序+1个共享类