3

Я создал простой проект ASP.NET 5 на основе шаблона Visual Studio ASP.NET 5 beta 8.Запуск ASP.NET 5 на Nano Server бросает «Невозможно загрузить DLL» kernel32 »

Я опубликовал проект, используя эту команду

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 

После того как я запустить 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.

+0

Вам необходимо установить обратные форвардеры ... – Pawel

+0

можете ли вы добавить это в качестве ответа, чтобы я мог отметить его –

ответ

1

У Nano Server нет файлов kernel32.dll и advapi32.dll, поэтому код, не связанный с libs по умолчанию, не будет работать. Вам нужно либо связать свой код с onecore.lib, либо установить обратные форвардеры. Обратные форвардеры перенаправляют вызовы API-интерфейсам kernel32.dll/advapi32.dll к аналогам, доступным на Nano Server. В некоторых системах OneCore (например, Win10 IoT Core on Raspberry Pi 2) по умолчанию установлены обратные форвардеры. Это не так в случае Nano Server, поскольку цель состоит в том, чтобы сделать его как можно меньшим.Следовательно, необходимо установить обратные форвардеры вручную, если они вам понадобятся. Чтобы связать это с Asp.Net 5 - как Http Platform Handler, так и Kestrel (или, если быть более конкретным libuv), связаны с файлами по умолчанию, поэтому для запуска Asp.Net 5 на Nano вам нужны пересылки, если вы не используете WebListener, который должен работать нормально без форвардеров.

0

Гипотеза

Вы упомянули, что это приложение отлично работает в Windows. Как вы запускаете его в Windows? Есть хороший шанс, что вы используете dnx451, а не dnxcore50 (CoreCLR) в качестве целевой платформы.

Это проблема, потому что вы публикуете для CoreCLR. (--runtime dnx-coreclr-win-x64.1.0.0-beta8), и есть хороший шанс, когда вы работаете локально, он использует полную платформу .NET.

Работает ли он с CoreCLR на Windows 10?

Вот что я сделал: попробуйте запустить веб-приложение в Developer Command Prompt for Visual Studio 2015, используя dnx.

  1. Переключить на версию CoreCLR из .NET с использованием dnvm:

    dnvm use 1.0.0-beta-8 -r coreclr 
    
  2. Восстановить пакеты

    dnu restore 
    
  3. Run

    dnx web 
    

Если это не удается, мы знаем, в чем проблема. Если это удастся, есть вероятность, что Nano не предоставит собственные API Windows, которые ваш код пытается выполнить. Если это так, вам нужно определить код, вызывающий это, и использовать что-то еще.

Как предназначаться только CoreCLR в Visual Studio

Вы можете удалить dnx451 цель из вашего project.json так, что Visual Studio вынужден использовать dnxcore50 (CoreCLR) версии. В идеале мы хотим использовать ту же самую версию/среду, которую мы публикуем.

+0

благодарю вас за ответ. Но я ориентируюсь только на coreclr. Это мой project.json "рамка": { "dnxcore50": {}} , Это global.json "СОК": { "версии": "1.0.0-beta8", «архитектура»: «x64», «runtime»: «coreclr» } –

Смежные вопросы