红隼与IIS – 运行时缺少libuv.dll

我们正在设置现有的Web API服务器,以便与现有API一起提供站点。 我一直在松散地阅读这篇文章 。

这是我的Global.asax.cs的样子:

public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); AutoMapperConfig.RegisterMappings(); var host = new WebHostBuilder() .UseKestrel() .UseWebRoot("wwwroot") .UseIISIntegration() .UseStartup() .Build(); host.Run(); } } 

和Startup.cs:

 public partial class Startup { public void Configure(IApplicationBuilder app) { app.UseDefaultFiles(); app.UseStaticFiles(); } } 

当我运行项目时,我收到错误

无法加载DLL“libuv”:找不到指定的模块。 (HRESULTexception:0x8007007E)

libuv是Kestrel的依赖。 如果我手动将它从packages文件夹复制到bin文件夹,它可以工作。 这个GitHub问题评论似乎有意义。 现在project.json正在被移走,我怎样才能让它自动复制?

有些人认为它不知道是否使用32位或64位版本的libuv,因为平台在项目属性中设置为Any CPU。 我已尝试在解决方案和项目设置中将其设置为x64,问题仍然存在。

如何自动将libuv.dll直接复制到构建目录?

我不考虑在项目中包含该文件(而不是在packages文件夹中)并将其设置为复制到输出目录的真正解决方案,只是一种解决方法。 我希望找到解决方案,而不是解决方法。

迁移项目之前我遇到过类似的问题。 Visual Studio可能会因项目不匹配而行为不端。

简单回答:您需要将项目更改为MSBuild / csproj格式。

首先,如果您尝试在解决方案中使用.NET Core,请在Visual Studio中右键单击您的项目, 如果您没有看到Edit xxxxxx.csproj那么您可能会Edit xxxxxx.csproj问题就像你上面报道的一样。

基本上,.NET Core项目模板在编译项目时使用不同的工具。

下面的解决方案是解决几乎所有试图以.NET Core为目标但希望使用其他框架库的项目的问题的通用方法。 到目前为止,还没有一个很好的工具来解决这个问题,所以你将不得不采用手动模式。


让我们开始吧。

解决方案非常简单(但有点单调乏味)。

第1步:使用新的MSBuild / csproj格式创建一个新项目

创建一个新项目,然后选择“.NET Core”。

步骤1

在几乎所有情况下,您可能都希望避免使用ASP.NET核心Web应用程序模板,但这可以用于另一个讨论。

第2步:定位正确的框架

右键单击该项目,然后选择“ Edit xxxxxx.csproj

  net452  Exe win7-x64  

选择一个您想要定位的框架,并确保它是受支持的(这是一个表)。
我在上面的代码片段中使用了net452作为示例。 您可以在此处找到有关命名的更多信息。

第2步

步骤3.对所有项目重复。

您将不得不为解决方案中的每个项目执行此操作,以防止Visual Studio出现意外行为。

关于如何让ASP.NET Core与旧框架配合良好,网上真的没有多少。 希望这会帮助你。 我希望我早些时候就自己有这个建议。

我只是将nuget包安装到我的项目中并重新部署。

Install-Package Libuv -Version 1.10.0

试试这个 – 它可以解决你的问题:

 var host = new WebHostBuilder() .UseKestrel() // .UseWebRoot("wwwroot") keep it if you need it .UseContentRoot(Directory.GetCurrentDirectory()) // this could solve your problem // .UseUrls("http://0.0.0.0:5000") use this if you're using nginx .UseIISIntegration() .UseStartup() .Build(); 

写下这些代码:

 using Microsoft.Owin; using Owin; using System.Web.Http; [assembly: OwinStartup(typeof(WebApiAndStaticFiles.OwinStartup))] namespace WebApiAndStaticFiles { public class OwinStartup { public void Configuration(IAppBuilder app) { app.UseDefaultFiles(); app.UseStaticFiles(); HttpConfiguration webApiConfiguration = new HttpConfiguration(); GlobalConfiguration.Configure(webApiConfiguration); // Instead of GlobalConfiguration.Configure(WebApiConfig.Register); app.UseWebApi(webApiConfiguration); } } } 

并安装这些nuget包:

          

你不能简单地在asp.net/iis托管应用程序管道中使用asp.net核心管道。 但Owin已经整合了这条管道,就像一个魅力。