【问题标题】:Calling 3rd party .dll from ASP .net. Dll not found.从 ASP .net 调用第 3 方 .dll。找不到DLL。
【发布时间】:2018-11-09 14:53:31
【问题描述】:

我正在使用 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?

【问题讨论】:

标签: c# asp.net .net


【解决方案1】:

参考路径

VS 中的引用路径仅供 Visual Studio 本地使用。将其视为一种覆盖引用的提示路径的方法,但只是在本地。 AKA - 一旦您想在 VS 之外运行代码(例如部署到服务器),它就无济于事。

如果您尝试在项目中引用 3rd 方 dll 以供使用,您将希望通过添加引用对话框直接在应用程序中引用它们。

GAC 与非 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 添加到该文件夹​​中,然后引用这些文件并拥有reference copy local to true 以便复制构建中的文件以确保它们始终与您的编译输出一起。

然后,lib 文件夹与您的代码一起受到源代码控制,以确保所需的 dll 版本与代码一致。

【讨论】:

  • 我在一个文件夹中大约有 100 个第三方 .dll。我添加其中 3 个作为对我的项目的引用(复制本地 = true)。这 3 个又依赖于文件夹中的其他 .dll。我不知道。我是否必须添加对项目中所有 100 个 .dll 的引用,或者有什么方法可以告诉 ASP .NET 查看我的目录?
  • 好吧,我认为你有点卡住了,如果你可以强命名它们,你必须自己将它们全部复制到本地或 GAC 中,但我不确定这是一个好主意,因为这些 DLL 不受您的控制。这是 nuget 包的完美理由。它会为你解决这个问题。尝试推动您的第 3 方打包它们。同时,使用本地复制引用每个 dll。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多