【发布时间】:2018-02-01 09:08:48
【问题描述】:
我目前正在尝试基本上公开一个我没有代码的本机 C++ 库作为 WebApi。为此,我创建了一个托管 C++ 包装库,它允许我的 Web 应用程序与本机代码进行通信。
所以项目的依赖看起来是这样的:
- Web 应用程序 (ASP.NET)
- 托管 C++ 包装器
- 本机 C++ 库 (DLL)
- 本机依赖项 (DLL)
- 本机 C++ 库 (DLL)
- 托管 C++ 包装器
我现在的问题是,我总是收到错误消息“无法加载文件或程序集 [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 是必要的,但仅靠更改是不够的。同样,我的猜测是权限问题。