使用相同的C#源构建一个完整的.net,PCL和dotnet核心程序集的单个源项目?

更新:这是指围绕project.json构建的一组过时的.net核心工具,这个问题及其答案在当前.net核心工具集(如Visual Studio 2017+)中的实用性非常有限。

使用Visual Studio 2015,更新3,我试图找出存在的当前限制,这将阻止我执行以下操作:

  1. 对于单个C#代码库,从相同的源代码编译完整的.net框架版本和PCL版本以及.net核心类库。

  2. 解决方案dir solutiondir\将包含一个src\ dir,其中包含一个projectdir\Solutiondir\src\projectdir )。

  3. Projectdir将包含一个HelloWorldPCL类库,它构建为classic .net PCL项目,以及其他框架目标。

  4. 从同一个Projectdir ,同样的HelloWorldPCL也将被编译为.net 4.6项目。

  5. 在同一个Projectdir ,同样的HelloWorldPCL也将被编译为.net core

  6. 上面的所有输出程序集将共享对一组C#代码的访问,这些代码可能有一些#if DOTNET#if NET46以及#if PCL条件定义来处理各种框架/环境中不可用的东西。

到目前为止,我可以完成上述大部分工作,但是当我尝试让Projectdir包含.net core工件(如project.jsonHelloWorldCore.xproj ,如果我尝试创建单独的.csproj.xproj ,IDE会给我带来很多错误。项目在同一个文件夹中,因此看起来不是正确的方法。

当我在磁盘上引入.xprojproject.json时,有一个工作的.csproj项目,但是我们还没有将它们添加到解决方案本身,它们只是坐在Real Project Sources旁边的磁盘上,我得到了一个N​​uget包恢复错误,只能通过删除project.json文件来消除,所以显然不可能在项目目录中有.csproj并且还有一个project.json文件夹。 必须在project.json模式( .net core项目样式)和.csproj模式(经典C#项目样式)之间进行选择。

我已经构建了一个“破坏”的代码库,它表明不可能使用包含.csprojproject.json的文件夹,然后尝试构建csprojproject.json项目而不会干扰它们:

https://bitbucket.org/wpostma/helloworldcoreandpcl

问题 :是否有任何方法可以从一组C#源文件构建项目,并具有完整的.net 4.6程序集,以及本机.net core类库,以及可能定位的PCL程序集任何特定的.net个人资料?

反对意见:你可以正确地问:“你不应该只使用一个PCL并完成它,并忘记定位完整.net或创建一个单独的.net core类库dll?”。 也许如果代码可以从单个源构建一次,没有任何条件定义,并且没有任何function上的差异,并且如果最低公分母PCL“ netstandard ”配置文件方法所施加的限制足够,则可以。 但是哪些情况甚至不可能呢?

我们是否必须有一些复杂的构建过程,我们要么复制项目文件,要么移动源代码,以实现单个.cs源文件目标多个.net profile nerdvana? 还是我忽略了其他解决方案?

更新 :当您使用project.json而不是使用.csproj构建它时,Visual Studio IDE可能会出现问题,导致无法直接向解决方案中的类库添加引用。 但是Jon指定的下面的解决方案表明你应该构建你的项目,然后使用dotnet pack构建一个nuget包。 如果你在这里查看我修改过的demo,你可以将pack.cmd文件包含我用来打包nuget包的步骤,然后在本地“发布”到我自己个人使用的文件(本地目录)nuget feed。

我会尝试采用纯粹的project.json方法。 例如,这是一个project.json文件,它将构建一个支持netstandard1.0 ,PCL配置文件328和.NET 4.6的软件包 – 每个配置都定义了自己的符号,因此您可以拥有条件代码。

 { "version": "1.0.0", "frameworks": { "net46": { "buildOptions": { "define": [ "NET46" ] } }, "netstandard1.0": { "buildOptions": { "define": [ "CORE" ] }, "dependencies": { "NETStandard.Library": "1.6.0" } }, ".NETPortable,Version=v4.0,Profile=Profile328": { "buildOptions": { "define": [ "PCL" ] }, "frameworkAssemblies": { "mscorlib": "", "System": "", } } } } 

然后使用dotnet pack创建nuget包。 (在添加所有其他元数据等之后)

您可以将xproj和csproj与不同的project.json文件一起使用。 我做了一篇关于你应该查看的主题的博客文章: http : //stackify.com/using-both-xproj-and-csproj-with-net-core/

基本上,你创建一个csproj拾取的projectname.project.json,然后创建xproj使用的project.json。 似乎工作!