【问题标题】:How to tell Visual Studio which runtime to build for如何告诉 Visual Studio 为哪个运行时构建
【发布时间】:2016-11-30 01:32:50
【问题描述】:

如何告诉 Visual Studio 针对多个运行时进行构建?

我创建了一个简单的 .NET Core (1.0) 控制台应用程序(带有 HTTP 下载的 Hello World)。我想为多个 RID(win7-x64、win10-x64 等)构建它,以便我可以发布它并包含在 Windows 2008 R2 (win7-x64) 上运行的独立应用程序的依赖项。但是我正在构建它的开发人员机器是 Windows 10,因此 VS 选择了 win10-x64,因此我的发布任务找不到任何适用于 win7-x64 的文件。我还想专门为 win10-x64 构建,所以即使我可以通过删除其余 RID 来强制它,我希望选择针对多个构建。

我知道我可以使用 MSBuild 和 dotnet cli 做到这一点,但我想知道如何在 VS 中做到这一点。

project.json:

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": "1.1.0",
    "System.Net.Http": "4.1.0"
  },

  "runtimes": {
    "win10-x64": {},
    "win81-x64": {},
    "win8-x64": {},
    "win7-x64": {}
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  }
}

请注意,我使用的是 System.Net.Http,它需要 win7 和 win10 中的不同依赖项进行测试。如果我在 Win2k8 上运行 win10-x64,那么它将失败,因为它缺少 win7 上运行时的依赖项。

应该没关系,但这里是主要代码块 program.cs 供参考:

using System;

namespace TestOnWindows2008
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World");

            using (var httpClient = new System.Net.Http.HttpClient())
            {
                string result = httpClient.GetStringAsync("https://www.microsoft.com/en-us/").Result;

                Console.WriteLine(result.Substring(0, 200));
            }

            Console.WriteLine("Done");
        }
    }
}

【问题讨论】:

  • 虽然 VS 集成仍处于预览阶段且不成熟,但您只是在这里提出了一些不切实际的要求。
  • 我不确定您为什么认为它不切实际。发布 UI 有一个下拉菜单来选择您要发布的运行时,它只是不为选定的运行时构建。似乎缺少某些东西,或者我不知道该怎么做。答案可能是由于工具、错误或已知问题的当前级别,这是不可能的。但是,问一个关于已发布(即使它带有预览标签)并被许多开发人员使用的系统的问题不是公平的吗?

标签: c# visual-studio visual-studio-2015 .net-core project.json


【解决方案1】:

虽然我没有直接回答你的问题,但也许会对你有所帮助。

由于您的目标平台是win7-x64,它比您的开发平台win10-x64 更早,因此您只能保留win7-x64 并将其用于调试和发布。

我刚刚使用 Windows 10 x64 Enterprise 测试了您的代码,一切正常。

project.json

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": "1.1.0",
    "System.Net.Http": "4.1.0"
  },

  "runtimes": {
    "win7-x64": {}
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  }
}

Program.cs 是您的问题。

这是输出:

对于run

C:\temp\test2>dotnet restore && dotnet run

日志:正在为 C:\temp\test2\project.json 恢复包...

log : 将锁定文件写入磁盘。路径:C:\temp\test2\project.lock.json

日志:C:\temp\test2\project.json

log : 恢复在 2603 毫秒内完成。

项目 test2 (.NETCoreApp,Version=v1.0) 将被编译,因为缺少预期的输出

为 .NETCoreApp 编译 test2,Version=v1.0

编译成功。

0 Warning(s)
0 Error(s)

经过时间 00:00:01.7257991

你好世界

完成

对于publish

C:\temp\test2>dotnet 发布

为 .NETCoreApp 发布 test2,Version=v1.0/win7-x64

项目 test2 (.NETCoreApp,Version=v1.0) 之前已编译。跳过编译。

发布:发布到 C:\temp\test2\bin\Debug\netcoreapp1.0\win7-x64\publish

成功发布1/1项目

【讨论】:

  • 是的,但是 win7-x64 会产生更多的依赖关系,并且为了部署到较新的服务器,它会包含这些不需要的额外内容。我肯定明白你的意思,但我的问题更多的是是否可以告诉 VS 为哪个构建,比如向项目文件添加一些属性或其他东西。我知道我可以告诉 msbuild 和 dotnet cli 使用哪个运行时,问题是在 VS 中是否也可以。
猜你喜欢
  • 2014-03-05
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多