c# - 带有 IIS 的 Kestrel - 运行时缺少 libuv.dll

标签 c# asp.net asp.net-web-api kestrel-http-server

我们正在设置一个现有的 Web API 服务器来与现有的 API 一起为网站提供服务。我一直在松散地关注 this article .

这是我的 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<Startup>()
           .Build();

        host.Run();
    }
}

和 Startup.cs:

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

当我运行项目时,出现错误

Unable to load DLL 'libuv': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

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

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

如何让libuv.dll自动直接复制到build目录下?

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

最佳答案

我以前在迁移项目时遇到过类似的问题。对于不匹配的项目,Visual Studio 可能会出现很多错误行为。

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

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

Basically, the .NET Core project templates uses different tooling when compiling the project.

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


让我们开始吧。

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

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

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

step1

在几乎所有情况下,您可能都希望避免使用 ASP.NET Core Web 应用程序模板,但那是另一种讨论。

第 2 步:定位正确的框架

右键单击项目并选择Edit xxxxxx.csproj

<PropertyGroup>
    <TargetFramework>net452</TargetFramework>
    <!--you will also probably want to note that you need these for a console app -->
    <OutputType>Exe</OutputType>
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
</PropertyGroup>

选择一个你想要定位的框架,并确保它得到支持(这里有一个表格)。
我在上面的代码片段中使用了 net452 作为示例。您可以找到有关 naming here 的更多信息.

step2

第 3 步。对所有项目重复。

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

网上关于如何使 ASP.NET Core 与旧框架良好协作的内容确实不多。希望这会帮助你。我希望自己早点得到这个建议。

关于c# - 带有 IIS 的 Kestrel - 运行时缺少 libuv.dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44143537/

相关文章:

c# - 如何跨操作系统接受具有指定内容类型的文件

c# - Ninject 和依赖注入(inject) WebApi 属性

asp.net - 可以手动将 OData 参数应用于 `.AsQueryable()` 的结果吗?

javascript - 为什么我对 web.api 的请求被长时间运行的 Controller 代码阻止?

c# - 如何使用参数化构造函数实现保存/加载接口(interface)?

c# - 是否有可单元测试的方式将文件上传到 ASP.NET WebAPI?

c# - ASP.net Repeater 获取当前索引、指针或计数器

c# - 专用于字节流的FIFO/Queue buffer

c# - 使用正则表达式从字符串中提取子字符串

c# - 根据时间更新值