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

问题是将dll复制到outputDir / External / foo目录,并且在运行时尝试找到它时,它失败,并显示以下错误:“无法加载dll:找不到模块”

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

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

谢谢!

最佳答案

您不想这样做,DLL Search Hell是您要避免的事情。 Windows对于在何处查找DLL非常不灵活。没错,DLL Hell没什么可惹的。非托管DLL的唯一好地方是与EXE在同一目录中。如果您不想将DLL存储在项目目录中,那么复制它们非常容易,那么您将需要一个使用xcopy.exe将DLL复制到输出目录的生成后事件。

替代方案不是很好。如果隐式加载了此DLL,则唯一的选择是使用安装程序将目录添加到系统的PATH环境变量中。这是一个非常糟糕的主意,对于您的程序来说太容易了。如果使用LoadLibrary或pinvoke声明进行了显式加载,则可以使用更具吸引力的选项,因为可以在需要DLL之前更改Main()方法中的搜索路径。通过使用Environment.SetEnvironmentVariable()或将SetDllDirectory()用作路径,将路径附加到PATH环境变量的本地副本中。请当心您还有部署问题,有人将不得不创建此子目录并将DLL复制到用户计算机上。不这样做的所有重要原因。

10-05 22:46
查看更多