【问题标题】:Native DLLs not loaded from PATH in ASP.NET WebApi未从 ASP.NET WebApi 中的 PATH 加载的本机 DLL
【发布时间】:2018-02-01 09:08:48
【问题描述】:

我目前正在尝试基本上公开一个我没有代码的本机 C++ 库作为 WebApi。为此,我创建了一个托管 C++ 包装库,它允许我的 Web 应用程序与本机代码进行通信。

所以项目的依赖看起来是这样的:

  • Web 应用程序 (ASP.NET)
    • 托管 C++ 包装器
      • 本机 C++ 库 (DLL)
        • 本机依赖项 (DLL)

我现在的问题是,我总是收到错误消息“无法加载文件或程序集 [ManagedWrapper.dll] 或其依赖项之一。找不到指定的模块。”

由于托管包装库在同一个解决方案中,它被列为参考,甚至复制到卷影副本,所以我认为问题出在本机依赖项上。我很清楚在 ASP.NET 中加载本机 DLL 存在问题,因为不会对它们进行卷影复制,也无法将它们添加到 GAC。我试图通过将它们添加到我的 %PATH% 来解决这个问题,但错误仍然存​​在。 Dependency walker 没有显示任何其他依赖项,将本机 DLL 添加到 system32/inetsvr 解决了问题,但这显然不是应该这样做的方式。

所以我的问题是:PATH 变量不起作用的原因是什么? (还有其他方法可以让它发挥作用吗?)

使用loadLibrary 以绝对路径加载并不是一个真正可行的解决方案,因为我对本机 C++ 库及其加载更多依赖项的方式没有影响。

【问题讨论】:

  • 仅供参考,同样的问题已解决here
  • @M.A 正如我在描述中所写,您的链接中的解决方案在这里不起作用。更改 PATH 变量并没有帮助,将所有内容复制到 system32/inetsvr 并不是一个好主意。
  • 更改路径是您为解决方案所做的吗?我同意你的第二点,你不应该将你的程序集安装到受保护的操作系统文件夹中。
  • @M.A 我将程序集(或者可能是整个项目?这是 2.5 年前)移动到不同的文件夹,然后更改了 PATH。更改 PATH 是必要的,但仅靠更改是不够的。同样,我的猜测是权限问题。

标签: c++ asp.net .net iis


【解决方案1】:

我想我自己找到了解决问题的方法,希望这对其他人也有帮助:

我的本​​地 DLL 在我的主文件夹中的某个位置。将它们移动到更易于访问的位置,即 C:\temp\,并将此文件夹添加到路径中似乎可以解决问题。我的猜测是,这是一个基于权限的问题,尽管我之前在我的主目录中为该文件夹添加了 IUSR 权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多