3

我基于 ASP.NET 5 beta 8 Visual Studio 模板创建了一个简单的 ASP.NET 5 项目。

我已经使用这个命令发布了项目

dnu publish <path to project.json> --out <path to publish folder> --configuration Release --runtime dnx-coreclr-win-x64.1.0.0-beta8 --wwwroot-out "wwwroot" --no-source

在 nano 服务器上运行 web.cmd 后,我收到此错误:

.\web.cmd : System.DllNotFoundException: Unable to load DLL 'kernel32': The specified module could not be found. (Exception from HRESULT: 
0x8007007E)
    + CategoryInfo          : NotSpecified: (System.DllNotFo...LT: 0x8007007E):String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

   at Microsoft.AspNet.Server.Kestrel.Networking.PlatformApis.WindowsApis.LoadLibrary(String dllToLoad)
   at Micros
oft.AspNet.Server.Kestrel.Networking.Libuv.Load(String dllToLoad)
   at Microsoft.AspNet.Server.Kestrel.ServerFactory.Start(IFeatureCollection serverFeatures, Func`2 application)
   at Microsoft.AspNet.Hosting.Internal.HostingEngine.Start()
   at Microsoft.AspNet.Hosting.Program.Main(String[] args)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Dnx.Runtime.Common.EntryPointExecutor.Execute(Assembly assembly, String[] args, IServiceProvider serviceProvider)
   at Microsoft.Dnx.ApplicationHost.Program.ExecuteMain(DefaultHost host, String applicationName, String[] args)
   at Microsoft.Dnx.ApplicationHost.Program.Main(String[] args)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Dnx.Runtime.Common.EntryPointExecutor.Execute(Assembly assembly, String[] args, IServiceProvider serviceProvider)
   at Microsoft.Dnx.Host.Bootstrapper.RunAsync(List`1 args, IRuntimeEnvironment env, String appBase, FrameworkName targetFramework)
   at Microsoft.Dnx.Host.RuntimeBootstrapper.ExecuteAsync(String[] args, BootstrapperContext bootstrapperContext)
   at Microsoft.Dnx.Host.RuntimeBootstrapper.Execute(String[] args, BootstrapperContext bootstrapperContext)

在 Windows 10 上运行时,相同的命令不会引发此错误。该应用程序在 Windows 10 上运行良好。

4

2 回答 2

1

Nano Server 没有 kernel32.dll 和 advapi32.dll,因此未链接到默认库的代码将无法工作。您需要将代码链接到 onecore.lib 或安装反向转发器。

反向转发器将对 kernel32.dll/advapi32.dll API 的调用重定向到 Nano Server 上可用的对应物。

在某些 OneCore 系统上(例如 Raspberry Pi 2 上的 Win10 IoT Core),默认安装反向转发器。Nano Server 的情况并非如此,因为我们的目标是使其尽可能小。因此,如果需要,需要手动安装反向转发器。

将此与 Asp.Net 5 相关联 - Http Platform Handler 和 Kestrel(或更具体的 libuv)都与默认库链接。因此,要在 Nano 上运行 Asp.Net 5,您需要转发器,除非您使用 WebListener(没有转发器应该可以正常工作)。

于 2015-11-07T16:56:27.477 回答
0

假设

您提到此应用程序在 Windows 上运行良好。你是如何在 Windows 上运行它的?您很有可能正在使用dnx451而不是dnxcore50(CoreCLR) 作为目标平台。

这是一个问题,因为您正在为 CoreCLR 发布。( --runtime dnx-coreclr-win-x64.1.0.0-beta8),当您在本地运行时,很有可能它使用的是完整的 .NET 框架。

它是否适用于 Windows 10 上的 CoreCLR?

这是我要做的:尝试在Developer Command Prompt for Visual Studio 2015using中运行 Web 应用程序dnx

  1. 使用以下命令切换到 .NET 的 CoreCLR 版本dnvm

    dnvm use 1.0.0-beta-8 -r coreclr
    
  2. 恢复包

    dnu restore
    
  3. dnx web
    

如果这失败了,我们就知道问题出在哪里。如果此操作成功,Nano 有可能不提供您的代码尝试执行的本机 Windows API。如果是这种情况,您必须识别导致此问题的代码并使用其他代码。

如何在 Visual Studio 中仅针对 CoreCLR

您可以dnx451从您的目标中删除目标,project.json以便强制 Visual Studio 使用dnxcore50(CoreCLR) 版本。理想情况下,我们希望运行与我们发布到的完全相同的版本/环境。

于 2015-11-01T23:24:48.077 回答