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

Create a single source project with full .net, PCL and dotnet core assemblies build from same C# source?

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

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

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

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

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

  4. 来自同一个 Projectdir 的同一个 HelloWorldPCL 也将为 .net 4.6 项目编译。

  5. 来自相同的 Projectdir 相同的 HelloWorldPCL 也将为 .net core 编译。

  6. 上面的所有输出程序集将共享对一组 C# 代码的访问权限,这些代码可能有一些 #if DOTNET#if NET46#if PCL 条件定义处理各种 frameworks/environments.

  7. 中不可用的东西

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

当我在磁盘上引入一个 .xproj 和一个 project.json 时,在一个工作的 .csproj 项目中,但我们没有将它们添加到解决方案本身,它们只是坐在那里在 Real Project Sources 旁边的磁盘上,我得到一个 Nuget 包恢复错误,只能通过删除 project.json 文件来解决,所以很明显不可能有 .csproj项目目录,还有一个 project.json 文件夹。必须在 project.json 模式(.net core 项目风格)和 .csproj 模式(classic C# 项目风格)之间做出选择。

我构建了一个 "broken" 代码库,演示了使用包含 .csprojproject.json 的文件夹然后尝试构建 csprojproject.json 没有他们干涉的项目:

https://bitbucket.org/wpostma/helloworldcoreandpcl

问题:是否有任何方法可以从一组 C# 源文件构建项目,并将完整的 .net 4.6 程序集作为目标,以及还有一个本机 .net core class 库,以及一个 PCL 程序集,它可能针对任何特定的 .net 配置文件?

异议:你问得对"shouldn't you just use one PCL and have done with it, and forget targeting full .net or creating a separate .net core class library dll?"。也许如果代码可以从单一来源构建一次,没有任何条件定义,并且在功能上没有任何差异,并且如果最小公分母施加的限制 PCL "netstandard" 配置文件方法就足够了,你可以。但是,那甚至不可能的情况呢?

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

更新:Visual Studio IDE 似乎有问题,阻止您直接添加对 class 的引用当您使用 project.json 而不是 .csproj 构建它时,解决方案中的库。然而,下面由 Jon 指定的解决方案表明您应该构建您的项目,然后使用 dotnet pack 构建一个 nuget 包。如果你在这里查看我修改过的演示,你可以 pack.cmd 文件包含我用来打包 nuget 包的步骤,然后在本地 "publish" 它到一个文件(本地目录)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 文件一起使用。我写了一篇关于主题的博客 post,您应该查看:http://stackify.com/using-both-xproj-and-csproj-with-net-core/

本质上,您创建了一个项目名称。project.json 由 csproj 获取,然后 project.json 由 xproj 使用。似乎有效!