在单个解决方案中在 DNX / ASP.NET 5 个项目 (project.json / xproj) 和其他 C# 项目 (csproj) 之间共享代码有哪些选择?

What are my options for sharing code between DNX / ASP.NET 5 projects (project.json / xproj) and other C# projects (csproj) within a single solution?

场景

我正在试验 Visual Studio 2015 RC,特别是考虑切换到新的 ASP.NET 5 框架、项目结构和运行 ASP.NET 5 应用程序的新 DNX。

我的雇主有许多针对 .NET Framework 4.5.2 的现有解决方案。在我们现有的 Visual Studio 解决方案中,我们可能有以下项目:

[Solution] Sample.sln
    [Folder] src
        [Project] ClassLibrary.csproj
        [Project] WindowsService.csproj
        [Project] WebApplication.csproj
    [Folder] test
        [Project] ClassLibrary.UnitTests.csproj
        ...

在这种情况下,ClassLibrary.csproj 是一个包含共享代码的 C# class 库。它是 WindowsService.csprojWebApplication.csproj.

引用的 / 的依赖项

我们并不是专门针对 .NET Core,dnxcore50。在这个阶段,我们很高兴以 .NET Framework 为目标,dnx451。但是,我们绝对会尝试利用 ASP.NET 5 和相关项目结构的新功能。

以下是我想到的一些选项,但都存在问题。

选项 1

当我们用新的 ASP.NET 5 DNX 项目 WebApplication-dnx 替换上面的 WebApplication.csproj 项目时,我们仍然可以从这个新的 DNX 项目和现有 WindowsService.csproj 项目。但是出现了一些问题:

  1. 这种方法意味着 ClassLibrary.csproj 中代码的任何更改都需要重建才能在 运行 WebApplication-dnx 中可见。这并不奇怪,但意味着我们无法获得 WebApplication-dnx.

  2. 的完整源代码编译优势
  3. 我们不能轻易针对其他框架,例如dnxcore50。如上所述,这不是现阶段的具体目标。

选项 2

如果我们用 DNX class 库项目替换 ClassLibrary.csproj^ ClassLibrary-dnx 那么选项 1 中的问题不适用。这种方法似乎更符合 .NET 运行时和相关技术(例如 ASP.NET 将向前打包的方式。

但是我找不到从 WindowsService.csproj 引用 ClassLibrary-dnx 的方法。如果这种方法可行,我想该解决方案与 Produce outputs on build 的项目级别选项有关,然后引用 .nupkg 甚至可能是在构建过程中生成的 .dll。但是,我看不到通过工具实现此目的的干净方法。

^ DNX class 库项目在 VS 2015 RC 中被称为 Class Library (Package)。此项目类型以前在 CTP 中称为 ASP.NET Class Library

总结

根据以上信息我正在寻找:

  1. 对我的场景选项和问题的一些反馈。

  2. 我没有想到的其他选项的建议。

  3. 也许可以指出应该使用哪种方法。

看看 EntityFramework 做了什么。

他们针对 3 个 TFM:net45、.NETPortable、Version=v4.5、Profile=Profile7、frameworkAssemblies,他们同时拥有 csproj 和 xproj in the same folder

基本上,每个项目都有两个项目文件。

However I cannot find a way to reference ClassLibrary-dnx from WindowsService.csproj.

不幸的是,这还不可能。您只能从 xproj 引用 csproj,反之则不行。您有两种选择:(1) 像 EF 一样同时拥有 xproj 和 csproj,或者 (2) 从 csproj 引用 NuGet 包。

如果您想执行备选方案 (2),那么您可以将 xproj 的输出设置到一个文件夹并将其添加为 NuGet 提要。