c# - 从 ASP .net 调用第 3 方 .dll。找不到DLL。
问题描述
我正在使用 ASP .NET 和 Web API 和 IIS 构建 REST 服务器 (?)。一切都很顺利,直到我添加了对 3rdparty .dll 的引用。然后我得到运行时错误:无法加载文件或程序集“xx.DLL”或其依赖项之一。
我已将所有相关目录(我认为)添加到 Visual Studio 中的“参考路径”页面。这些路径是否在运行时使用?或者我必须编辑项目中的其他文件/设置?
此外,当我搜索有问题的 .dll 时,我找到了一个副本: C:\Users\Andy\AppData\Local\Temp\Temporary ASP.NET Files\root\24c08d5b\dcd0af52\assembly\dl3\58d7d48b\005afae1_ece9d201\xx.DLL
为什么 ASP .NET 会复制我的 .dll?我可以阻止它这样做吗?为什么这个目录里只有一个.dll?
解决方案
参考路径
VS 中的引用路径仅供 Visual Studio 本地使用。将其视为一种覆盖引用的提示路径的方法,但只是在本地。AKA - 一旦您想在 VS 之外运行代码(例如部署到服务器),它就无济于事。
如果您尝试在项目中引用 3rd 方 dll 以供使用,您将希望通过添加引用对话框直接在应用程序中引用它们。
GAC vs Not Gac'd 和复制本地属性
如果在计算机上将第 3 方 dll 安装到 GAC 中,那么只要所有计算机都安装了它,您就应该没问题。只需添加引用并将复制本地属性设置为 false(在 VS 中单击您的引用并查看它的属性选项卡)。
如果它们没有安装到 GAC 中,则需要复制本地 true。
您在临时 asp.net 文件位置看到的结果取决于您的引用,您的引用的复制本地属性等于 true。
Copy Local = true 表示:我需要此 DLL 以使我的应用程序正常运行,并且我知道此 DLL 不在 GAC 中,因此请在编译时复制它。
Copy Local = false 表示:我需要此 DLL,但它位于我的服务器/部署位置的 GAC 中,因此我不需要复制它。.Net 运行时会为我找到它(在 GAC 中)。
奖金
如果这些 3rd 方 DLL 有一个 nuget 包,请使用它。
如果他们不考虑:
处理不在 GAC 中的第 3 方 dll 的引用/使用的一种普遍接受的方法是在项目解决方案的根目录中创建一个 lib 文件夹,将所需的 dll 添加到该文件夹中,然后引用这些文件并在本地复制参考为 true 以便复制构建中的文件以确保它们始终与您的编译输出一起使用。
然后 lib 文件夹与您的代码一起进行源代码控制,以确保所需的 dll 版本与代码一致。
推荐阅读
- mongodb - 我想在 MongoDB 中的特定时间段后删除文档中的指定字段。我该怎么做?
- c# - 在传递给 json 之前从对象中删除字段
- shell - 通过 Oozie 调度遍历 hdfs 目录的脚本
- php - 如何在前端打印 php mysql 查询响应消息
- pandas - Pandas - 将多个 csv 文件合并为一个时的问题
- drop-down-menu - 如何在颤动中为下拉按钮制作圆形边框?
- r - 有光泽的 Quantstrat
- c# - Task.Run(Action) 是否启动一个新的线程 id 线程池中没有更多线程?
- python - 在 python 2 中使用 super() 引发类型错误
- python - 如何为 Keras 神经网络创建特异性自定义指标