运行 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
。
使用 dnvm
:
切换到 .NET 的 CoreCLR 版本
dnvm use 1.0.0-beta-8 -r coreclr
恢复包
dnu restore
运行
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(在没有转发器的情况下应该可以正常工作)。
我基于 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
。
使用
切换到 .NET 的 CoreCLR 版本dnvm
:dnvm use 1.0.0-beta-8 -r coreclr
恢复包
dnu restore
运行
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(在没有转发器的情况下应该可以正常工作)。