代码之家  ›  专栏  ›  技术社区  ›  Mike Atlas

DllImport在搜索dll时是否遵循SafeDllSearchMode?

  •  2
  • Mike Atlas  · 技术社区  · 14 年前

    [DllImport("unmanaged.dll")]
    static extern int SomeFuncion1(int parm);
    

    是不是 DllImportAttribute SafeDllSearchMode 在注册表中设置?我在MSDN中找不到任何指示搜索顺序是否确实遵循“标准搜索顺序”的内容。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

    是的,P/Invoke封送拆收器只使用LoadLibrary()。它观察环境。这是不可证明的,它实际上是在一个这样的帖子,直到你自己尝试,我得出结论,非常肯定没有合理的选择。LoadLibrary完全属于“硬”API函数的范畴。

    福威夫,会的 从未

    在该DLL上使用Dumpbin.exe/exports来找出实际从该DLL导出的内容。

        2
  •  2
  •   Mike Atlas    14 年前

    首先,我创建了一个测试工具:

    [DllImport("SomeDllThatDoesntExist.dll")]
    public static extern void Test();
    
    static void Main()
    {
         string currentWorkingDirectory = Directory.GetCurrentDirectory();
         Console.WriteLine(currentWorkingDirectory);
         Directory.SetCurrentDirectory("E:\\foobar");
         currentWorkingDirectory = Directory.GetCurrentDirectory();
         Console.WriteLine(currentWorkingDirectory);
         // Call method in DLL we know doesn't exist.
         Test();
    }
    

    然后我用 Procmon Test() 电话是:

    1. 执行目录
    2. System32目录
    3. 系统目录(16位)
    4. Windows目录
    5. 所有我的$PATH目录

    这表明它遵守“安全”搜索顺序,因为当前目录是5,而不是2,如果禁用了SafeDllSearchMode则是这样。然后我添加了 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode