【问题标题】:What causes a .net program to look for files in System32 or SysWOW64?是什么导致 .net 程序在 System32 或 SysWOW64 中查找文件?
【发布时间】:2013-11-23 00:05:48
【问题描述】:

我的代码依赖于通常安装在系统文件夹中的第三方 dll。当我运行一些引用此 dll 的代码时,它可以正常工作,因为它会根据进程的位版本从 System32 或 SysWOW64 中获取它。但是对于其他一些代码,它只有在 dll 在 bin 文件夹中时才有效,如果不是,则抛出找不到文件的异常。

是什么导致 .net 程序分别在 System32 或 SysWOW64 中查找文件?

【问题讨论】:

    标签: .net dll


    【解决方案1】:

    “第三方 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是个很不爽的问题。

    【讨论】:

    • 谢谢,抱歉忘记提及 dll 确实是不受管理的。并且正如您所假设的 [DllImport] 引用的那样。所以如果我理解正确的话,windows应该已经从系统目录加载了dll,我不应该看到这个错误?
    • 我仍然不知道“其他代码”可能意味着什么。什么错误?我只能回答“是什么导致 .net 程序在 System32 中查找文件”的问题。
    • “一些代码”和“一些其他代码”=托管 c# 代码,在两个不同的项目中。 error = FileNotFound 异常,由未找到非托管 dll 引起。
    猜你喜欢
    • 2018-05-29
    • 2015-05-10
    • 1970-01-01
    • 2013-09-29
    • 2014-11-27
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多