我的最终目标是创建一个跨平台(非Web)控制台应用程序,所以我现在正在探索.NET Core.
在我之前的.NET项目中,我在Visual Studio中进行了所有开发,但我还创建了一个批处理/ MSBuild文件,因此我只需单击一下即可构建整个项目(包括设置,NuGet包,带二进制文件的zip文件等).这是以前项目的一个例子.
最后,我想用我的.NET Core测试项目做类似的事情.
但是现在我在第一步失败了:我无法在Visual Studio之外构建它,因此结果可以在没有安装.NET Core的另一台Windows机器上运行.
(在第一步中,我忽略了跨平台部分 - 我很乐意让它在Windows上运行)
我设法让它在Visual Studio 2015 Community Edition中运行如下:
在Visual Studio中创建新项目:"新建项目"⇒"Web"⇒"控制台应用程序(包)"
在Visual Studio中创建新的发布配置文件(菜单中的"Build"⇒"Publish").
这将创建一个PowerShell脚本(以及一个带有设置的XML文件)
这是我在GitHub上的测试项目.
当我再次在菜单中"构建"⇒"发布"时,Visual Studio显然会再次执行先前创建的PowerShell脚本.
结果略超过90 MB,由598个文件夹中的825个文件组成,如下所示:
当我将它复制到另一台机器上时(安装了Win 7/.NET 4/未安装的.NET Core ),它可以工作.
这个答案和这个答案听起来像我可以用来dnu publish
通过命令行获得相同的结果.
据我所知,.NET的核心部分仍移动的目标,现在,所以显然dnu
现在dotnet
不是.
所以我尝试为它执行dotnet publish
(并创建一个批处理文件):
dotnet publish "%~dp0\src\CoreTestVisualStudio" -c Release -r win7-x64 -o "%~dp0\release\cli"
结果包含一个.exe
文件和一堆DLL,只有25个文件和1.5 MB,都在一个文件夹中:
显然,这里缺少.NET Core运行时,正如预期的那样,当我尝试在没有安装.NET Core的机器上执行它时,此应用程序崩溃(与上面提到的相同).
我尝试在Visual Studio外部执行PowerShell脚本(在我创建发布配置文件时创建),但它失败了,因为脚本需要一些参数而我不知道要传递什么:
param($publishProperties, $packOutput, $nugetUrl)
脚本中还有这一行:
# to learn more about this file visit http://go.microsoft.com/fwlink/?LinkId=524327
...但链接只指向.NET Web开发和工具博客的登录页面.
我究竟做错了什么?
我知道.NET Core的第一个版本主要关注ASP.NET,但据我所知,ASP.NET Core应用程序也只是控制台应用程序,所以我认为一个基本的控制台应用程序现在可以工作.
另一方面,大多数控制台应用程序"入门"文档仍然缺失,所以也许它太早了dotnet publish
,控制台应用程序尚未完成?
几天后编辑:我怀疑我没有做错任何问题,这是.NET Core命令行工具中的一个问题,因此我将其发布到命令行工具的问题跟踪器.
问题解决了!
我将它发布在.NET Core命令行工具的问题跟踪器上,结果证明它是一个错误dotnet publish
- 它没有捆绑C++运行时,这是在没有.NET的机器上执行编译的应用程序所需的核心安装.
临时解决方案是安装C++运行时.
"真正的"解决方案是在三天前的拉取请求中完成的,现在包含在最新的安装程序中.
在这个版本中,dotnet publish
确实捆绑C++运行时,这样的结果将一台机器上工作,没有.NET的核心.
用于dnu
:
有一个dnu publish
被调用的选项--runtime
,指定发布时要包含的运行时.您可以在命令中使用完整的运行时名称,例如:
dnu publish --runtime dnx-clr-win-x86.1.0.0-rc1
用于dotnet
:
您不需要指定运行时或框架版本 - 默认情况下,dotnet publish
将使用框架project.json
和当前运行时风格.但是,文档说明:
dotnet-publish命令还需要project.json中的某些依赖项才能工作.即,必须将Microsoft.NETCore.Runtime包作为依赖项引用,以便命令将运行时文件以及应用程序的文件复制到已发布的位置.