c# - 创建具有相同C#源构建的完整.net,PCL和dotnet核心程序集的单个源项目?

标签 c# .net visual-studio-2015 asp.net-core .net-standard-1.5

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

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

  • 对于单个C#代码库,请从相同的来源编译完整的.net框架版本和PCL版本,以及.net核心类库。
  • 解决方案目录solutiondir\将包含一个src\目录,该目录包含一个projectdir\(Solutiondir\src\projectdir)。
  • Projectdir将包含一个HelloWorldPCL类库,该类库是作为classic .net PCL项目构建的,并且还包含其他框架目标。
  • 也将从相同的Projectdir中为.net 4.6项目编译相同的HelloWorldPCL。
  • 也将从相同的Projectdir中为.net core编译相同的HelloWorldPCL。
  • 上面所有输出程序集将共享对一组C#代码的访问权限,这些C#代码可能具有#if DOTNET#if NET46#if PCL条件定义,以处理在各种框架/环境中不可用的事情。

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

    对于一个工作正常的.csproj项目,当我在磁盘上引入.xprojproject.json时,但我们还没有将它们添加到解决方案本身中,它们只是坐在Real Project Sources旁边的磁盘上,我得到了Nuget包还原错误,这是只能通过删除project.json文件使它消失,因此很明显,不可能在项目目录中有.csproj,也没有project.json文件夹。必须在project.json模式(.net core项目样式)和.csproj模式(经典C#项目样式)之间进行选择。

    我建立了一个“ splinter 的”代码库,演示了不可能使用同时包含.csprojproject.json的文件夹,然后尝试构建csprojproject.json项目而又不会干扰它们的可能性:

    https://bitbucket.org/wpostma/helloworldcoreandpcl

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

    异​​议:您可能会问:“您难道不应该只使用一个PCL并完成了它,而忘记将完整的.net定位为目标还是创建一个单独的.net core类库dll吗?”。也许如果代码可以从一个来源一次构建一次,而没有任何条件定义,并且在功能上没有任何差异,并且如果最低公分母PCL“netstandard”配置文件方法所施加的限制已足够,则可以。但是,在不可能的情况下呢?

    为了实现单个.cs源文件针对多个.net配置文件nerdvana的目标,我们是否必须进行复杂的构建过程,在其中复制项目文件或移动源代码?还是我忽略了替代解决方案?

    更新:Visual Studio IDE似乎存在问题,当您使用project.json而不是.csproj生成解决方案时,它会阻止您直接在解决方案中添加对类库的引用。但是,由Jon指定的以下解决方案表明您应该构建项目,然后使用dotnet pack构建nuget包。如果您在此处查看经过修改的演示,则pack.cmd文件可以包含我打包nuget包时使用的步骤,然后将其本地“发布”到文件(本地目录)nuget供我个人使用。

    最佳答案

    我会尝试使用纯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包。 (在添加所有其他元数据等之后)

    关于c# - 创建具有相同C#源构建的完整.net,PCL和dotnet核心程序集的单个源项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38206209/

    相关文章:

    c# - System.Random.Next() 总是返回相同的序列吗

    c# - Visual Studio 中的哪些功能或任务需要管理权限?

    c# - Linq where element.equals 一个数组

    jquery - VS2015中jQuery安装在哪里?

    c# - 'Mountain' 没有实现接口(interface)成员 'IBiome.height'

    c# - 如何从表或结果集中获取列名和其他元数据

    c# - WIX 安装程序,更改从另一个程序选择的安装文件夹?

    c# - 在c#中同时多次运行一个方法

    sql-server - SSRS 2014 报告部署问题

    angular - 测试 npm 是否通过 visual studio 2015 的代理连接