C# 是否可以发布ASP.NET 5应用程序,使目标计算机不';不需要安装DNX吗?

C# 是否可以发布ASP.NET 5应用程序,使目标计算机不';不需要安装DNX吗?,c#,asp.net,.net,asp.net-core,C#,Asp.net,.net,Asp.net Core,从: “DNX是一个SDK,包含构建和运行所需的所有位 应用程序,包括核心CLR中的CLR。它可以是 与应用程序一起部署的bin 我有点搞不懂这到底意味着什么。基于此描述,以及我在Microsoft公告和博客文章中看到的其他评论,您似乎可以使用ASP.NET 5应用程序创建一个没有外部依赖项的自包含包。该捆绑包将包括您的代码、DNX runner、~11MB的CoreCLR以及您可能使用的任何其他NuGet依赖项。“运行您的应用程序所需的所有信息”,随时可以放到干净的目标机器上 但是,当我使用d

从:

“DNX是一个SDK,包含构建和运行所需的所有位 应用程序,包括核心CLR中的CLR。它可以是 与应用程序一起部署的bin

我有点搞不懂这到底意味着什么。基于此描述,以及我在Microsoft公告和博客文章中看到的其他评论,您似乎可以使用ASP.NET 5应用程序创建一个没有外部依赖项的自包含包。该捆绑包将包括您的代码、DNX runner、~11MB的CoreCLR以及您可能使用的任何其他NuGet依赖项。“运行您的应用程序所需的所有信息”,随时可以放到干净的目标机器上

但是,当我使用dnu publish时,情况并非如此。生成的包包含我的代码,以及我实际使用的标准库片段的DLL。然而,它并没有拉进整个CoreCLR。。。而且它肯定不会吸引DNX。我的
project.json
文件中的
run
命令被转换为一个
run.cmd
批处理文件,如下所示:

@"dnx.exe" --appbase "%~dp0approot\src\ConsoleApplication" Microsoft.Framework.ApplicationHost run %*
。。。这表明DNX预计已经安装在目标系统上,在该捆绑包之外

我是不是错过了一些基本的东西?如果您需要在目标系统上安装DNX,那么我不确定这种方法有什么好处。是否可以采取其他步骤来发布DNX和CoreCLR完全嵌入且自包含的捆绑包?

我看到
dnu publish
有一个可选的
--native
参数,但我不确定这是否相关。该参数希望您指定一个运行时。当我使用“clr”时,会收到错误消息,“
本机映像生成仅支持.NET Core版本”
”。当我使用“coreclr”时,我得到了这个丑陋的堆栈跟踪:

C:\Users\Steve\Desktop\ConsoleApplication>dnu publish --native --runtime active
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Framework.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'Microsoft.Framework.Project, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.IO.FileNotFoundException: Could not load the specified file.
File name: 'Microsoft.Framework.Project'
   at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName assemblyName)
   at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)
   at Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.<>c.<Create>b__4_0(String r)
   at System.Linq.Lookup`2.Create[TSource](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at System.Linq.GroupedEnumerable`3.GetEnumerator()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
   at Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.Create(PublishOptions options, PublishRoot root, IEnumerable`1 contexts)
   at Microsoft.Framework.PackageManager.Publish.PublishManager.Publish()
   at Microsoft.Framework.PackageManager.Program.<>c__DisplayClass3_2.<Main>b__4()
   at Microsoft.Framework.Runtime.Common.CommandLine.CommandLineApplication.Execute(String[] args)
   at Microsoft.Framework.PackageManager.Program.Main(String[] args)
System.IO.FileNotFoundException: Could not load the specified file.
File name: 'Microsoft.Framework.Project'
   at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName assemblyName)
   at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)
C:\Users\Steve\Desktop\ConsoleApplication>dnu发布--本机--运行时活动
System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Framework.Project,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。
文件名:“Microsoft.Framework.Project,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”-->System.IO.FileNotFoundException:无法加载指定的文件。
文件名:“Microsoft.Framework.Project”
位于System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName AssemblyName)
在System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr-gchManagedAssemblyLoadContext,AssemblyName-AssemblyName)
在Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.c.b_u4_0(字符串r)中
在System.Linq.Lookup`2.Create[TSource](IEnumerable`1源、Func`2键选择器、Func`2元素选择器、IEqualityComparer`1比较器)
在System.Linq.GroupedEnumerable`3.GetEnumerator()中
位于System.Linq.Enumerable.WhereEnumerableInterator`1.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
在Microsoft.Framework.PackageManager.Publish.NativeImageGenerator.Create(PublishOptions选项、PublishRoot根目录、IEnumerable`1上下文)
在Microsoft.Framework.PackageManager.Publish.PublishManager.Publish()中
在Microsoft.Framework.PackageManager.Program.c__DisplayClass3_2.b_4()中
在Microsoft.Framework.Runtime.Common.CommandLine.CommandLineApplication.Execute(字符串[]args)中
位于Microsoft.Framework.PackageManager.Program.Main(字符串[]args)
System.IO.FileNotFoundException:无法加载指定的文件。
文件名:“Microsoft.Framework.Project”
位于System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(AssemblyName AssemblyName)
在System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr-gchManagedAssemblyLoadContext,AssemblyName-AssemblyName)

从理论上讲,您应该能够将应用程序部署到一台连.NET Framework都没有安装的机器上,但我记得听说,即使是dnxcore今天也有一些.NET Framework依赖项,以后也会消失(我可能弄错了,值得一试)

假设这是存在的,并且您希望实现这一点,那么您确实应该使用
--runtime
开关,并且如果要将
active
作为值传递,则需要使coreclr处于活动状态

例如:

dnvm use 1.0.0-beta4 -r coreclr -p
活动版本运行时体系结构位置Al ia s ------ ------- ------- ------------ -------- -- 1.0.0-beta4 clr x64 C:\Users\Tugberk\.dnx\runtimes 1.0.0-beta4 clr x86 C:\Users\Tugberk\.dnx\runtimes 1.0.0-beta4 coreclr x64 C:\Users\Tugberk\.dnx\runtimes *1.0.0-beta4 coreclr x86 C:\Users\Tugberk\.dnx\runtimes
这应该将运行时与应用程序捆绑在一起。

为什么希望它包含“整个CoreCLR”?核心CLR的全部要点是,您只需要包含应用程序用户使用的程序集。否则,您可能会使用.NET Framework而不是.NET Core。好吧,我想重点是CoreCLR只有10到11MB左右,再加上您需要的任何其他依赖项。与整个.NET框架的100+兆相比,即使你的应用程序没有使用90%的兆。不管怎样,问题仍然存在。如果目标计算机仍然需要安装DNX(这反过来又包括一个或多个完整的CLR运行时),那么捆绑应用程序使用的核心库程序集有什么意义呢。。。我离得很近,但实际上走得太远了!我正在运行
dnu publish--native--runtime active
。我只有 Active Version Runtime Architecture Location Al ia s ------ ------- ------- ------------ -------- -- 1.0.0-beta4 clr x64 C:\Users\Tugberk\.dnx\runtimes 1.0.0-beta4 clr x86 C:\Users\Tugberk\.dnx\runtimes 1.0.0-beta4 coreclr x64 C:\Users\Tugberk\.dnx\runtimes * 1.0.0-beta4 coreclr x86 C:\Users\Tugberk\.dnx\runtimes