运行 ASP.NET Nano Server 上的 5 次抛出 "Unable to load DLL 'kernel32'"

Running ASP.NET 5 on Nano Server throws "Unable to load DLL 'kernel32'"

我基于 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)

当 运行ning 在 Windows 10 上时,相同的命令不会抛出此错误。应用程序在 Windows 10.

上工作正常

假设

您提到此应用程序在 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 2015 中的 Web 应用程序使用 dnx

  1. 使用 dnvm:

    切换到 .NET 的 CoreCLR 版本
    dnvm use 1.0.0-beta-8 -r coreclr
    
  2. 恢复包

    dnu restore
    
  3. 运行

    dnx web
    

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

如何在 Visual Studio

中仅针对 CoreCLR

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

Nano Server 没有 kernel32.dll 和 advapi32.dll,因此未针对默认库 link 编辑的代码将无法运行。您需要 link 针对 onecore.lib 的代码或安装反向转发器。

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

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

将此与 Asp.Net 相关联 5 - Http 平台处理程序和 Kestrel(或更具体的 libuv)都针对默认库 linked。因此,对于 Nano 上的 运行 Asp.Net 5,您需要转发器,除非您使用 WebListener(在没有转发器的情况下应该可以正常工作)。