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

Does my whole solution have to be .NET Framework rather than .NET Core just because I use a NuGet package that needs the .NET Framework?

我有一个.NET核心解决方案,由三部分组成:

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

    根据这个答案中的建议,我将我的业务逻辑项目更改为target.net 4.6.1(net461)。

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

    我认为.NET核心在很大程度上是.NET框架的一个子集,除了只需要"更大"的框架之外,不会有任何功能上的改变,那就好了。但是,重新确定了我的数据访问项目的目标之后,我发现有一些东西丢失了。例如,它现在使用C_7值元组来反对我。

    虽然我可以通过nuget包添加回值元组,但我还需要进行其他更改(dataAnnotations似乎已消失/移动),而且我似乎正在以.NET框架的方式进行所有操作。

    有办法解决这个问题吗?我觉得我在拉一根绳子,最终我会回到ASP.NET MVC…


    可以同时针对两个框架。我在一个项目中工作,我希望以.NET核心2.0为目标,但需要使用.NET框架包。

    为此,请打开.csproj文件并用新的targetframeworks标记替换targetframework标记。

    net461;netcoreapp2.0

    不幸的是,在Visual Studio中不可能通过UI来实现这一点。进行此更改并重新加载Visual Studio后,目标框架将为空。


    另一个可能的解决方案(也许不是你想要的)是将你的项目分成更小的项目,然后业务和数据逻辑可以转换成服务(SOA-https://en.wikipedia.org/wiki/service-oriented_architecture)

    这看起来似乎是"长途跋涉",但它的最终优势在于,分离的逻辑服务和主项目在技术和大多数其他需求方面相互独立。

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


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

    以下是我认为的要点:

  • 如果使用的nuget包使用的是.NET 4.6,则不能在以.NET核心为目标的dll中使用该包。

  • 您可以(根据@matt h的答案)有一个以.NET核心和.NET 4.6为目标的dll,但这并没有真正的帮助,因为只创建了两个版本的dll,并且只有.NET 4.6版本可以使用nuget包。因此,您的DLL需要以.NET 4.6为目标。

  • 通过扩展,解决方案中直接引用该dll的每个项目也需要以.NET 4.6为目标。所以,是的,这种传染确实传播了。-(

  • 在我的例子中,这意味着我的ASP.NET核心Web应用程序也需要以.NET 4.6为目标-我起初假设这意味着完全放弃ASP.NET核心,并放弃我在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项目的两个版本——一个针对.NET核心,另一个针对.NET 4.6——以了解区别是什么,以及我必须做什么更改)。

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