试图从其文件夹中加载 dll 的应用程序

Posted

技术标签:

【中文标题】试图从其文件夹中加载 dll 的应用程序【英文标题】:Applications trying to load dll not from its folder 【发布时间】:2013-07-31 00:30:49 【问题描述】:

我使用 3.6 版本的 LO SDK 库制作了一个在 LibreOffice Calc 中构建报告的应用程序。这些 dll 是 .NET 2.0,afaik,而我的应用程序是 .NET 3.5,因此可以很好地协同工作。

但是当我在安装了 LO 4.0 的 PC 上运行应用程序时,它看起来好像不是从应用程序文件夹(正确的 dll 被复制的地方)加载 dll,而是从主机 PC 的某个位置加载 dll,因为它抛出异常“这程序集由比当前加载的运行时更新的运行时构建,并且无法在加载 cli_uno.dll 时加载”(当我尝试运行报告时)。看起来 LO 4 SDK dll 是为 .NET 4.0 组装的?

嗯,它不是为 .NET 4.0 重建应用程序的选项(因为它会在有任何新的 .NET 5.0 dll 时重复)。

有没有办法让应用程序只从自己的文件夹中加载 dll?

UDPATE cli_uno.dll 实际上根本不包含在我的应用程序中。它位于 LO 安装文件夹中,显然由我的应用程序中包含的那些“cli_*.dll”文件调用。但我无法控制将安装什么版本的 LO!它只是不受任何汇编版本设置的控制。当应用程序在 LO 3.6 上正常工作时,它只是不正确,但在升级到 LO 4.0 后停止工作。说真的,我已经在古老的 Delphi 7 中使用古老的库连接到 MS Excel(它是在 XP/2000 版本实际出现时创建的)制作应用程序,并且至少在 2007 版本上运行良好。

难道不应该使用接口,对于不同版本,甚至不同平台的应用程序,能够互操作,在它们之间交换数据吗?可能我使用的 LO SDK 完全错误?

【问题讨论】:

可能重复? ***.com/questions/267693/… 看起来,我去看看,谢谢。 正如我现在所见,它不受应用程序程序集版本设置的控制——“cli_uno.dll”不是我的应用程序的一部分,而是 LO 安装,它由我的应用程序调用。我已经更新了这个问题。 【参考方案1】:

您的本地程序集是否已签名?如果您可以删除文件夹中包含的 dll 上的签名,则它始终从该文件夹加载。只要它被签名,它首先会查看 GAC。

【讨论】:

实际上,我的应用程序组装组件都没有签名。但必须对 LO SDK 的 dll 进行签名。怀疑我可以从中删除标志。 显然你不能。但可能你可以在应用程序启动期间使用 Assembly.Load(),从而将你需要的 dll 加载到内存中,而不是等待框架扫描 dll。不过不太确定。 正如我现在所见,它不受应用程序程序集版本设置的控制——“cli_uno.dll”不是我的应用程序的一部分,而是 LO 安装,它由我的应用程序调用。我已经更新了这个问题。

以上是关于试图从其文件夹中加载 dll 的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

无法在 WPF 项目中加载 DLL

在 Windows 中的 Qt 中加载外部 dll

无法在新的 appDomain 中加载程序集

dll中的资源字符串在程序中加载后不完全可见

mcrypt 和 IIS - 模块不会在 PHP 中加载

C# 在 appdomain 调用方法中加载 dll,而不会再次加载 dll