从 VS 2017 发布 .net 核心应用程序

Posted

技术标签:

【中文标题】从 VS 2017 发布 .net 核心应用程序【英文标题】:Publish .net core app from VS 2017 【发布时间】:2017-04-12 12:29:47 【问题描述】:

我正在 Visual Studio 2017 社区版下创建一个新的解决方案,它主要是一个 .net 核心 Web 应用程序。

它运行良好,完全没有问题,但是我们想将它部署到 Debian 机器上并且是自包含的,所以我们在项目中添加了运行时标识符。到目前为止一切顺利,当我们想要为我们拥有的任何平台发布应用程序(到目录)时,问题就出现了,没有指定目标平台的选项,并且创建的发布文件只是 .net 程序集,没有本机模块。

当然,如果我们使用dotnet publish -r (platform),它会按预期工作,它会创建正确的平台文件并且一切似乎都很好,但是不得不去命令行编译它是非常烦人的。

所以问题是,如何使用 Visual Studio 2017 为具体平台发布自包含应用程序?甚至有可能还是这仍然缺失?

【问题讨论】:

【参考方案1】:

目前 VS2017 不会这样做,所以你必须放到命令行并运行它。

dotnet publish -c release -r ubuntu.14.04-x64

显然用你的 debian 风格替换 ubuntu。

这也在我的 csproj 文件中,您可能也需要它。

<OutputType>Exe</OutputType>

【讨论】:

您可以编写一个构建脚本来运行后期构建。 似乎不再需要 OutputType,如果我使用 dotnet 发布它已经创建了一个可执行文件。 我认为后期构建脚本目前是您最好的选择,直到它被排序为止。 是的,看来这是唯一的选择,可惜。 我接受之前的回答,因为乔尔是第一个回答并且评论或多或少相同的人,我也赞成你的回答。【参考方案2】:

您可以更新您的项目文件 csproj 以添加 runtimeIdentifier:

<RuntimeIdentifier>win7-x86</RuntimeIdentifier>

将 win7-x86 替换为您想要的运行时。

尽管在发布屏幕上显示的是 Runtime: Portable,但它似乎确实生成了一个独立版本。

在资源管理器中的结果:

vs2017执行的命令

 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc.exe /noconfig /unsafe- /checked- /nowarn:1701,1702,1705,2008 /nostdlib+ /platform:x86 /errorreport:prompt /warn:4 /define:TRACE;RELEASE;NETCOREAPP1_1 /errorendlocation /preferreduilang:en-US /reference:C:\Users\Joel\.nuget\packages\microsoft.csharp\4.3.0\ref\netstandard1.0\Microsoft.CSharp.dll /reference:C:\Users\Joel\.nuget\packages\microsoft.visualbasic\10.1.0\ref\netstandard1.1\Microsoft.VisualBasic.dll /reference:C:\Users\Joel\.nuget\packages\microsoft.win32.primitives\4.3.0\ref\netstandard1.3\Microsoft.Win32.Primitives.dll /reference:C:\Users\Joel\.nuget\packages\system.appcontext\4.3.0\ref\netstandard1.6\System.AppContext.dll /reference:C:\Users\Joel\.nuget\packages\system.buffers\4.3.0\lib\netstandard1.1\System.Buffers.dll /reference:C:\Users\Joel\.nuget\packages\system.collections.concurrent\4.3.0\ref\netstandard1.3\System.Collections.Concurrent.dll /reference:C:\Users\Joel\.nuget\packages\system.collections\4.3.0\ref\netstandard1.3\System.Collections.dll /reference:C:\Users\Joel\.nuget\packages\system.collections.immutable\1.3.0\lib\netstandard1.0\System.Collections.Immutable.dll /reference:C:\Users\Joel\.nuget\packages\system.componentmodel.annotations\4.3.0\ref\netstandard1.4\System.ComponentModel.Annotations.dll /reference:C:\Users\Joel\.nuget\packages\system.componentmodel\4.3.0\ref\netstandard1.0\System.ComponentModel.dll /reference:C:\Users\Joel\.nuget\packages\system.console\4.3.0\ref\netstandard1.3\System.Console.dll /reference:C:\Users\Joel\.nuget\packages\system.diagnostics.debug\4.3.0\ref\netstandard1.3\System.Diagnostics.Debug.dll /reference:C:\Users\Joel\.nuget\packages\system.diagnostics.diagnosticsource\4.3.0\lib\netstandard1.3\System.Diagnostics.DiagnosticSource.dll /reference:C:\Users\Joel\.nuget\packages\system.diagnostics.process\4.3.0\ref\netstandard1.4\System.Diagnostics.Process.dll /reference:C:\Users\Joel\.nuget\packages\system.diagnostics.tools\4.3.0\ref\netstandard1.0\System.Diagnostics.Tools.dll /reference:C:\Users\Joel\.nuget\packages\system.diagnostics.tracing\4.3.0\ref\netstandard1.5\System.Diagnostics.Tracing.dll /reference:C:\Users\Joel\.nuget\packages\system.dynamic.runtime\4.3.0\ref\netstandard1.3\System.Dynamic.Runtime.dll /reference:C:\Users\Joel\.nuget\packages\system.globalization.calendars\4.3.0\ref\netstandard1.3\System.Globalization.Calendars.dll /reference:C:\Users\Joel\.nuget\packages\system.globalization\4.3.0\ref\netstandard1.3\System.Globalization.dll /reference:C:\Users\Joel\.nuget\packages\system.globalization.extensions\4.3.0\ref\netstandard1.3\System.Globalization.Extensions.dll /reference:C:\Users\Joel\.nuget\packages\system.io.compression\4.3.0\ref\netstandard1.3\System.IO.Compression.dll /reference:C:\Users\Joel\.nuget\packages\system.io.compression.zipfile\4.3.0\ref\netstandard1.3\System.IO.Compression.ZipFile.dll /reference:C:\Users\Joel\.nuget\packages\system.io\4.3.0\ref\netstandard1.5\System.IO.dll /reference:C:\Users\Joel\.nuget\packages\system.io.filesystem\4.3.0\ref\netstandard1.3\System.IO.FileSystem.dll /reference:C:\Users\Joel\.nuget\packages\system.io.filesystem.primitives\4.3.0\ref\netstandard1.3\System.IO.FileSystem.Primitives.dll /reference:C:\Users\Joel\.nuget\packages\system.io.filesystem.watcher\4.3.0\ref\netstandard1.3\System.IO.FileSystem.Watcher.dll /reference:C:\Users\Joel\.nuget\packages\system.io.memorymappedfiles\4.3.0\ref\netstandard1.3\System.IO.MemoryMappedFiles.dll /reference:C:\Users\Joel\.nuget\packages\system.io.unmanagedmemorystream\4.3.0\ref\netstandard1.3\System.IO.UnmanagedMemoryStream.dll /reference:C:\Users\Joel\.nuget\packages\system.linq\4.3.0\ref\netstandard1.6\System.Linq.dll /reference:C:\Users\Joel\.nuget\packages\system.linq.expressions\4.3.0\ref\netstandard1.6\System.Linq.Expressions.dll /reference:C:\Users\Joel\.nuget\packages\system.linq.parallel\4.3.0\ref\netstandard1.1\System.Linq.Parallel.dll /reference:C:\Users\Joel\.nuget\packages\system.linq.queryable\4.3.0\ref\netstandard1.0\System.Linq.Queryable.dll /reference:C:\Users\Joel\.nuget\packages\system.net.http\4.3.0\ref\netstandard1.3\System.Net.Http.dll /reference:C:\Users\Joel\.nuget\packages\system.net.nameresolution\4.3.0\ref\netstandard1.3\System.Net.NameResolution.dll /reference:C:\Users\Joel\.nuget\packages\system.net.primitives\4.3.0\ref\netstandard1.3\System.Net.Primitives.dll /reference:C:\Users\Joel\.nuget\packages\system.net.requests\4.3.0\ref\netstandard1.3\System.Net.Requests.dll /reference:C:\Users\Joel\.nuget\packages\system.net.security\4.3.0\ref\netstandard1.3\System.Net.Security.dll /reference:C:\Users\Joel\.nuget\packages\system.net.sockets\4.3.0\ref\netstandard1.3\System.Net.Sockets.dll /reference:C:\Users\Joel\.nuget\packages\system.net.webheadercollection\4.3.0\ref\netstandard1.3\System.Net.WebHeaderCollection.dll /reference:C:\Users\Joel\.nuget\packages\system.numerics.vectors\4.3.0\ref\netstandard1.0\System.Numerics.Vectors.dll /reference:C:\Users\Joel\.nuget\packages\system.objectmodel\4.3.0\ref\netstandard1.3\System.ObjectModel.dll /reference:C:\Users\Joel\.nuget\packages\system.reflection.dispatchproxy\4.3.0\ref\netstandard1.3\System.Reflection.DispatchProxy.dll /reference:C:\Users\Joel\.nuget\packages\system.reflection\4.3.0\ref\netstandard1.5\System.Reflection.dll /reference:C:\Users\Joel\.nuget\packages\system.reflection.extensions\4.3.0\ref\netstandard1.0\System.Reflection.Extensions.dll /reference:C:\Users\Joel\.nuget\packages\system.reflection.metadata\1.4.1\lib\netstandard1.1\System.Reflection.Metadata.dll /reference:C:\Users\Joel\.nuget\packages\system.reflection.primitives\4.3.0\ref\netstandard1.0\System.Reflection.Primitives.dll /reference:C:\Users\Joel\.nuget\packages\system.reflection.typeextensions\4.3.0\ref\netstandard1.5\System.Reflection.TypeExtensions.dll /reference:C:\Users\Joel\.nuget\packages\system.resources.reader\4.3.0\lib\netstandard1.0\System.Resources.Reader.dll /reference:C:\Users\Joel\.nuget\packages\system.resources.resourcemanager\4.3.0\ref\netstandard1.0\System.Resources.ResourceManager.dll /reference:C:\Users\Joel\.nuget\packages\system.runtime\4.3.0\ref\netstandard1.5\System.Runtime.dll /reference:C:\Users\Joel\.nuget\packages\system.runtime.extensions\4.3.0\ref\netstandard1.5\System.Runtime.Extensions.dll /reference:C:\Users\Joel\.nuget\packages\system.runtime.handles\4.3.0\ref\netstandard1.3\System.Runtime.Handles.dll /reference:C:\Users\Joel\.nuget\packages\system.runtime.interopservices\4.3.0\ref\netcoreapp1.1\System.Runtime.InteropServices.dll /reference:C:\Users\Joel\.nuget\packages\system.runtime.interopservices.runtimeinformation\4.3.0\ref\netstandard1.1\System.Runtime.InteropServices.RuntimeInformation.dll /reference:C:\Users\Joel\.nuget\packages\system.runtime.numerics\4.3.0\ref\netstandard1.1\System.Runtime.Numerics.dll /reference:C:\Users\Joel\.nuget\packages\system.security.cryptography.algorithms\4.3.0\ref\netstandard1.6\System.Security.Cryptography.Algorithms.dll /reference:C:\Users\Joel\.nuget\packages\system.security.cryptography.encoding\4.3.0\ref\netstandard1.3\System.Security.Cryptography.Encoding.dll /reference:C:\Users\Joel\.nuget\packages\system.security.cryptography.primitives\4.3.0\ref\netstandard1.3\System.Security.Cryptography.Primitives.dll /reference:C:\Users\Joel\.nuget\packages\system.security.cryptography.x509certificates\4.3.0\ref\netstandard1.4\System.Security.Cryptography.X509Certificates.dll /reference:C:\Users\Joel\.nuget\packages\system.security.principal\4.3.0\ref\netstandard1.0\System.Security.Principal.dll /reference:C:\Users\Joel\.nuget\packages\system.text.encoding\4.3.0\ref\netstandard1.3\System.Text.Encoding.dll /reference:C:\Users\Joel\.nuget\packages\system.text.encoding.extensions\4.3.0\ref\netstandard1.3\System.Text.Encoding.Extensions.dll /reference:C:\Users\Joel\.nuget\packages\system.text.regularexpressions\4.3.0\ref\netcoreapp1.1\System.Text.RegularExpressions.dll /reference:C:\Users\Joel\.nuget\packages\system.threading\4.3.0\ref\netstandard1.3\System.Threading.dll /reference:C:\Users\Joel\.nuget\packages\system.threading.tasks.dataflow\4.7.0\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll /reference:C:\Users\Joel\.nuget\packages\system.threading.tasks\4.3.0\ref\netstandard1.3\System.Threading.Tasks.dll /reference:C:\Users\Joel\.nuget\packages\system.threading.tasks.extensions\4.3.0\lib\netstandard1.0\System.Threading.Tasks.Extensions.dll /reference:C:\Users\Joel\.nuget\packages\system.threading.tasks.parallel\4.3.0\ref\netstandard1.1\System.Threading.Tasks.Parallel.dll /reference:C:\Users\Joel\.nuget\packages\system.threading.thread\4.3.0\ref\netstandard1.3\System.Threading.Thread.dll /reference:C:\Users\Joel\.nuget\packages\system.threading.threadpool\4.3.0\ref\netstandard1.3\System.Threading.ThreadPool.dll /reference:C:\Users\Joel\.nuget\packages\system.threading.timer\4.3.0\ref\netstandard1.2\System.Threading.Timer.dll /reference:C:\Users\Joel\.nuget\packages\system.xml.readerwriter\4.3.0\ref\netstandard1.3\System.Xml.ReaderWriter.dll /reference:C:\Users\Joel\.nuget\packages\system.xml.xdocument\4.3.0\ref\netstandard1.3\System.Xml.XDocument.dll /debug- /debug:portable /filealign:512 /nologo /optimize+ /out:obj\Release\netcoreapp1.1\win7-x86\ConsoleApp1.dll /ruleset:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset" /target:exe /warnaserror- /utf8output /deterministic+ /analyzer:C:\Users\Joel\.nuget\packages\microsoft.codeanalysis.analyzers\1.1.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll /analyzer:C:\Users\Joel\.nuget\packages\microsoft.codeanalysis.analyzers\1.1.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.Analyzers.dll Program.cs "C:\Users\Joel\AppData\Local\Temp\.NETCoreApp,Version=v1.1.AssemblyAttributes.cs" obj\Release\netcoreapp1.1\win7-x86\\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs obj\Release\netcoreapp1.1\win7-x86\\TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs obj\Release\netcoreapp1.1\win7-x86\\TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs obj\Release\netcoreapp1.1\win7-x86\ConsoleApp1.AssemblyInfo.cs

【讨论】:

正如我在问题中所述,我们已经拥有目标平台(Windows10 和 Debian)的运行时标识符,但发布不会创建两个单独的发布文件夹,也不会创建本机可执行文件。 @Gusman 那么答案很简单:不,这是不可能的。就像没有多个目标框架的 ui 一样。 这是你真正知道的事情还是只是一个假设? 我自己没有编写 Visual Studio 代码,所以从这个意义上说,这是一个假设。但基本上,如果您单击 vs2017 中的发布 UI 按钮,将执行 csc.exe 命令,您可以检查日志并查看是否添加了运行时。但可能对于多个运行时,它总结了它。 (因为您当时只能构建 1 个运行时) 好的,谢谢你的信息,我会检查编译日志。

以上是关于从 VS 2017 发布 .net 核心应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 VS 2017 中针对完整的 .net 框架 asp.net 核心项目运行 XUnit 2.2.0 单元测试时出现 System.BadImageFormatException

vs2017下载的net不显示

.Net用VS 2012远程调试Win2003网站

.net core 2.0 Razor pages VS 2017表格数据下载

VS 2017 .Net Core 2.0 控制台应用程序发布失败

Configuration.GetConnectionString 在 VS Code 上运行 asp.net 核心时返回 null 但在 Visual Studio 上很好