用相同的c#源代码创建一个完整的.net、PCL和.net核心程序集的单源项目

本文关键字:net PCL 核心 项目 单源 程序集 源代码 创建 一个 | 更新日期: 2023-09-27 17:54:50

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

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

  1. 对于一个c#代码库,编译一个完整的。net框架版本和一个PCL版本,以及一个。net核心类库。

  2. 解决方案目录solutiondir'将包含包含projectdir' (Solutiondir'src'projectdir)的src'目录。

  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时,IDE给了我很多错误,如果我试图在同一文件夹中创建单独的.csproj.xproj项目,那么这似乎不是正确的方法。

当我在磁盘上引入.xprojproject.json时,有一个工作的.csproj项目,但我们没有将这些添加到解决方案本身,它们只是坐在真正的项目源旁边的磁盘上,我得到一个Nuget包恢复错误,这只能通过删除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类库,以及可能针对任何特定.net配置文件的PCL汇编?

反对意见:你可能会问"你不应该只使用一个PCL并完成它,而忘记目标是完整的。net或创建一个单独的.net core类库dll吗?"也许,如果代码可以从单一源构建一次,没有任何条件定义,没有任何功能差异,并且如果最低公分母PCL"netstandard"配置文件方法所施加的限制是足够的,那么您可以。但是那些根本不可能的情况呢?

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

Update:当您使用project.json而不是使用.csproj构建它时,Visual Studio IDE似乎存在一个问题,它阻止您直接在解决方案中添加对类库的引用。但是,下面由Jon指定的解决方案表明,您应该先构建项目,然后使用dotnet pack构建nuget包。如果你看了我修改后的演示,你就可以打包了。cmd文件包含了我用来打包nuget包的步骤,然后在本地"发布"到一个文件(本地目录)nuget提要,供我个人使用。

用相同的c#源代码创建一个完整的.net、PCL和.net核心程序集的单源项目

我会尝试使用纯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与不同的项目一起使用。json文件。我写了一篇关于这个话题的博文,你应该看看:http://stackify.com/using-both-xproj-and-csproj-with-net-core/

本质上,您创建一个projectname.project.json, csproj选择它,然后项目。xproj使用的Json。似乎有效!