启动 IIS Express 托管 Web 项目时无法加载 DLL (VS2015)
Unable to load DLLs when starting up IIS Express hosted web project (VS2015)
背景:
我正在将控制台应用程序迁移到我们现有的 Web API 项目中。所有开发工作都在 Visual Studiod 2015(使用 IIS Express)上完成。该应用程序使用很少的第三方数据源 api DLL 从该数据源获取数据。所有这些 DLL 都由我们的内部 nuget 包源管理。
问题:
现在控制台应用程序运行良好,可以加载那些 DLL。我将整个逻辑复制到我的 Web 项目中,并通过 nuget 添加了 DLL。解决方案构建但在启动 Web 项目时出现以下错误:
Could not load file or assembly 'ABC.DLL' or one of its dependencies. The specified module could not be found.
其中 ABC.DLL 是第三方 DLL 之一。
我做了以下事情:
- 确认ABC.DLL在我的web项目的bin文件夹中
- 将我的 Web 项目的目标构建平台更改为 x86 并取消选中 VS2015 中的 "Use 64 bit version of IIS Express for websites and project" 设置(第三方 dll 为 32 位)
- 运行 dumpbin.exe 对 ABC.DLL 的依赖并得到 XYZ.dll,MSVCR120.dll,KERNEL32.dll,MSVCP120.dll,mscoree.dll
关于最后一步,bin 文件夹中的那些 dll 都丢失了(但最后 4 个 DLL 应该在 system32 win 目录中所以应该无关紧要?)
至于XYZ.dll,它是另一个第三方库,位于C:\Program Files (x86)\XYZ\文件夹中。我手动将它复制到 Web 项目 bin 文件夹(实际上复制到 XYZ 文件夹内的所有 Dll),但仍然遇到同样的问题。
问题
- 我在这里错过了什么?控制台应用程序显然可以加载 ABC.DLL 但 Web 项目不能。如果你能告诉我接下来要检查什么,我将不胜感激。
- 启动网页的错误消息不是很有用,有没有办法找出 Web 项目试图加载第三方 DLL 的位置?
提前致谢!
简单地将外部 DLL 添加到您的 Bin 文件夹并不是一个好主意。文件可能会出于各种原因从该文件夹中消失,例如您的团队成员删除了看似无用的 DLL,或通过 Visual Studio 清除它。此外,您的解决方案中引用项目的输出 DLL 将在那里结束,并在您每次构建项目时被替换。
对于第三方 DLL,您应该做的是在您的项目中或附近创建一些 "dependencies" 文件夹,然后将 DLL 粘贴到其中。然后您应该右键单击该项目,select 添加引用,浏览到新的 "dependencies" 文件夹,然后以这种方式添加对 DLL 的引用。这类似于 NuGet 的工作方式;它将 DLL 保存在 packages 文件夹内各自的文件夹中,并添加对这些 DLL 的引用。
我终于找到了问题并感谢所有帮助,我不得不在 VS 中禁用卷影复制(在 64 bit managed assembly with unmanaged dependencies not loading in IIS / ASP.NET MVC 4 中提到)。
背景:
我正在将控制台应用程序迁移到我们现有的 Web API 项目中。所有开发工作都在 Visual Studiod 2015(使用 IIS Express)上完成。该应用程序使用很少的第三方数据源 api DLL 从该数据源获取数据。所有这些 DLL 都由我们的内部 nuget 包源管理。
问题:
现在控制台应用程序运行良好,可以加载那些 DLL。我将整个逻辑复制到我的 Web 项目中,并通过 nuget 添加了 DLL。解决方案构建但在启动 Web 项目时出现以下错误:
Could not load file or assembly 'ABC.DLL' or one of its dependencies. The specified module could not be found.
其中 ABC.DLL 是第三方 DLL 之一。
我做了以下事情:
- 确认ABC.DLL在我的web项目的bin文件夹中
- 将我的 Web 项目的目标构建平台更改为 x86 并取消选中 VS2015 中的 "Use 64 bit version of IIS Express for websites and project" 设置(第三方 dll 为 32 位)
- 运行 dumpbin.exe 对 ABC.DLL 的依赖并得到 XYZ.dll,MSVCR120.dll,KERNEL32.dll,MSVCP120.dll,mscoree.dll
关于最后一步,bin 文件夹中的那些 dll 都丢失了(但最后 4 个 DLL 应该在 system32 win 目录中所以应该无关紧要?)
至于XYZ.dll,它是另一个第三方库,位于C:\Program Files (x86)\XYZ\文件夹中。我手动将它复制到 Web 项目 bin 文件夹(实际上复制到 XYZ 文件夹内的所有 Dll),但仍然遇到同样的问题。
问题
- 我在这里错过了什么?控制台应用程序显然可以加载 ABC.DLL 但 Web 项目不能。如果你能告诉我接下来要检查什么,我将不胜感激。
- 启动网页的错误消息不是很有用,有没有办法找出 Web 项目试图加载第三方 DLL 的位置?
提前致谢!
简单地将外部 DLL 添加到您的 Bin 文件夹并不是一个好主意。文件可能会出于各种原因从该文件夹中消失,例如您的团队成员删除了看似无用的 DLL,或通过 Visual Studio 清除它。此外,您的解决方案中引用项目的输出 DLL 将在那里结束,并在您每次构建项目时被替换。
对于第三方 DLL,您应该做的是在您的项目中或附近创建一些 "dependencies" 文件夹,然后将 DLL 粘贴到其中。然后您应该右键单击该项目,select 添加引用,浏览到新的 "dependencies" 文件夹,然后以这种方式添加对 DLL 的引用。这类似于 NuGet 的工作方式;它将 DLL 保存在 packages 文件夹内各自的文件夹中,并添加对这些 DLL 的引用。
我终于找到了问题并感谢所有帮助,我不得不在 VS 中禁用卷影复制(在 64 bit managed assembly with unmanaged dependencies not loading in IIS / ASP.NET MVC 4 中提到)。