【问题标题】:Unable to load dll: Module cannot be found无法加载 dll:找不到模块
【发布时间】:2013-06-10 19:14:31
【问题描述】:

我正在使用引用非托管 dll 的托管 DLL。 我在 /External/foo/ 目录 下添加了非托管 dll,并将“复制到输出目录”更改为始终。

问题是 dll 被复制到 outputDir/External/foo 目录,当运行时试图找到它时,它失败并出现以下错误:“无法加载 dll:找不到模块”

当我将它直接复制到输出目录时,一切正常。

如何设置项目运行时在输出目录的子目录中搜索?

谢谢!

【问题讨论】:

  • 能否请您发布您的代码?谢谢
  • 你不能使用后期构建步骤吗?
  • 正如@rene 提到的,添加一个postbuild 步骤,将external/foo/ 中的文件复制到输出目录。
  • 感谢您的回答。无论我走到哪里,人们都告诉我要避免构建后事件,我知道执行 xcopy 的选项,但这听起来像是为问题打开了大门。奇怪的是,我无法指导我的项目查看输出目录的子目录。 dll在那里!只有两个子目录! :) 我很想知道是否有人知道通过视觉工作室来做这件事的方法。

标签: c# dll visual-studio-2012 path


【解决方案1】:

您不想这样做,DLL Search Hell 是您想要避免的。 Windows 在查找 DLL 的位置方面非常不灵活。理所当然地,DLL Hell 没什么好惹的。非托管 DLL 的唯一好地方是与您的 EXE 在同一目录中。如果您不想将 DLL 存储在项目目录中,因此复制它们非常容易,那么您将需要一个使用 xcopy.exe 将 DLL 复制到输出目录的构建后事件。

替代品不漂亮。如果此 DLL 是隐式加载的,那么唯一的选择是使用安装程序将目录添加到系统的 PATH 环境变量中。这是一个非常糟糕的主意,太容易让您的程序崩溃。如果使用 LoadLibrary 或 pinvoke 声明显式加载它,那么您有更有吸引力的选择,因为您可以在需要 DLL 之前更改 Main() 方法中的搜索路径。使用 Environment.SetEnvironmentVariable() 或 pinvoke SetDllDirectory() 将路径附加到 PATH 环境变量的本地副本。请注意您也有部署问题,有人将不得不创建此子目录并将 DLL 复制到用户计算机上。 不这样做的所有重要理由。

【讨论】:

    【解决方案2】:

    这是我们在上一个项目中所做的事情。编写一个批处理文件,将此非托管 dll 复制到输出目录。每次程序编译时调用批处理文件。您也可以使用配置键控制批处理文件的调用。所以它基于配置键值 true/false 运行。我希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多