我正在使用引用非托管dll的托管DLL。 我在 / External / foo / directory 下添加了非托管dll,并且我将“Copy To Output Directory”更改为always。
问题是dll被复制到 outputDir / External / foo 目录,当运行时试图找到它时,它会因此错误而失败:“无法加载dll:无法找到模块“
当我将它直接复制到输出目录时,一切都运行良好。
如何设置项目运行时以在outut目录的子目录中搜索?
谢谢!
答案 0 :(得分:2)
你不想这样做,DLL Search Hell是你想要避免的。 Windows在查找DLL的位置上非常不灵活。这是理所当然的,DLL地狱没什么可惹的。非托管DLL的唯一好处是与EXE在同一目录中。如果您不想将DLL存储在项目目录中,那么复制它们非常容易,那么您将需要使用xcopy.exe将DLL复制到输出目录的后期构建事件。
替代方案不漂亮。如果隐式加载此DLL,则唯一的选择是使用安装程序将目录添加到系统的PATH环境变量中。这是一个非常糟糕的想法,对你的程序来说太容易了。如果使用LoadLibrary或pinvoke声明显式加载它,那么你有更多有吸引力的选项,因为你可以在需要DLL之前改变Main()方法中的搜索路径。通过使用Environment.SetEnvironmentVariable()或pinvoke SetDllDirectory()将路径附加到PATH环境变量的本地副本。请注意,您也有部署问题,有人必须创建此子目录并将DLL复制到用户的计算机上。 不的所有重要理由都是这样做的。
答案 1 :(得分:1)
这是我们在上一个项目中所做的事情。编写一个批处理文件,将该非托管dll复制到输出目录。每次程序编译时调用批处理文件。您也可以使用Config键控制批处理文件的调用。所以它基于配置键值true / false运行。我希望这有帮助