在Nano Server上运行ASP.NET 5会抛出“无法加载DLL'kernel32'”

时间:2015-11-01 22:27:02

标签: asp.net-core asp.net-core-mvc dnx windows-server-2016 nano-server

我已经基于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上运行正常。

2 个答案:

答案 0 :(得分: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)都链接到默认的libs,因此要在Nano上运行Asp.Net 5,你需要转发器,除非你使用WebListener,它应该工作正常转发器。

答案 1 :(得分: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 2015dnx中运行网络应用。

  1. 使用dnvm切换到.NET的CoreCLR版本:

    dnvm use 1.0.0-beta-8 -r coreclr
    
  2. 还原包

    dnu restore
    
  3. 运行

    dnx web
    
  4. 如果失败,我们知道问题是什么。如果成功,Nano可能无法提供您的代码尝试执行的本机Windows API。如果是这种情况,您必须确定导致此问题的代码并使用其他内容。

    如何仅在Visual Studio中定位CoreCLR

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