我的代码依赖于通常安装在系统文件夹中的第三方 dll。当我运行一些引用此 dll 的代码时,它可以正常工作,因为它会根据进程的位版本从 System32 或 SysWOW64 中获取它。但是对于其他一些代码,它仅在 dll 位于 bin 文件夹中时才有效,如果不是,则抛出未找到文件异常。
是什么导致 .net 程序分别在 System32 或 SysWOW64 中查找文件?
“第三方 DLL”含糊不清,但如果它们是非托管 DLL,则符合要求。通常由程序中的 [DllImport] 指令引用。CLR 要求 Windows 加载 DLL,它需要找到 DLL 并在几个地方查找文件。存储EXE的目录在前,Windows系统目录在后,PATH环境变量列出的目录在后。由于搜索始终包括 Windows 系统目录,因此它往往被 ab/用于存储这些 DLL。
如果 DLL 是 .NET 程序集,那么这将不起作用,CLR 永远不会在操作系统目录或 PATH 目录中查找文件。它首先在 GAC 中查找,然后是存储 EXE 的目录。如果您使用<probing>
app.exe.config 文件中的元素,则可以选择查看 EXE 目录的子目录。所以这就是你的情况的可能原因。
始终将 DLL 与 EXE 存储在同一目录中,这样可以避免很多麻烦。Windows系统目录不是个好地方,DLL Hell是个很不爽的问题。