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