在单个解决方案中在 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.csproj
和 WebApplication.csproj
.
引用的 / 的依赖项
我们并不是专门针对 .NET Core,dnxcore50
。在这个阶段,我们很高兴以 .NET Framework 为目标,dnx451
。但是,我们绝对会尝试利用 ASP.NET 5 和相关项目结构的新功能。
以下是我想到的一些选项,但都存在问题。
选项 1
当我们用新的 ASP.NET 5 DNX 项目 WebApplication-dnx
替换上面的 WebApplication.csproj
项目时,我们仍然可以从这个新的 DNX 项目和现有 WindowsService.csproj
项目。但是出现了一些问题:
这种方法意味着 ClassLibrary.csproj
中代码的任何更改都需要重建才能在 运行 WebApplication-dnx
中可见。这并不奇怪,但意味着我们无法获得 WebApplication-dnx
.
的完整源代码编译优势
我们不能轻易针对其他框架,例如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
。
总结
根据以上信息我正在寻找:
对我的场景选项和问题的一些反馈。
我没有想到的其他选项的建议。
也许可以指出应该使用哪种方法。
看看 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 提要。
场景
我正在试验 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.csproj
和 WebApplication.csproj
.
我们并不是专门针对 .NET Core,dnxcore50
。在这个阶段,我们很高兴以 .NET Framework 为目标,dnx451
。但是,我们绝对会尝试利用 ASP.NET 5 和相关项目结构的新功能。
以下是我想到的一些选项,但都存在问题。
选项 1
当我们用新的 ASP.NET 5 DNX 项目 WebApplication-dnx
替换上面的 WebApplication.csproj
项目时,我们仍然可以从这个新的 DNX 项目和现有 WindowsService.csproj
项目。但是出现了一些问题:
这种方法意味着
ClassLibrary.csproj
中代码的任何更改都需要重建才能在 运行WebApplication-dnx
中可见。这并不奇怪,但意味着我们无法获得WebApplication-dnx
. 的完整源代码编译优势
我们不能轻易针对其他框架,例如
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
。
总结
根据以上信息我正在寻找:
对我的场景选项和问题的一些反馈。
我没有想到的其他选项的建议。
也许可以指出应该使用哪种方法。
看看 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 提要。