假设我想在某个DLL中进行典型的非托管调用:
[DllImport("unmanaged.dll")]
static extern int SomeFuncion1(int parm);
DllImportAttribute是否根据注册表中SafeDllSearchMode的设置搜索DLL?我在MSDN上没有找到任何指示搜索顺序是否遵循“标准搜索顺序”的内容。
假设我想在某个DLL中进行典型的非托管调用:
[DllImport("unmanaged.dll")]
static extern int SomeFuncion1(int parm);
DllImportAttribute是否根据注册表中SafeDllSearchMode的设置搜索DLL?我在MSDN上没有找到任何指示搜索顺序是否遵循“标准搜索顺序”的内容。
好吧,我有些急躁并且自己回答了这个问题,但是 Hans 在这期间已经回答了。
首先,我创建了一个测试工具:
[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()
调用的搜索路径顺序如下:
这表明它遵循“安全”搜索顺序,因为当前目录是#5而不是#2,如果SafeDllSearchMode被禁用,则会是#2。然后我添加了 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
注册表值并将其设置为1(禁用),再次运行我的测试工具。搜索路径仍然相同。我不知道是否弄错了添加注册表键,但我真正想知道的唯一重要的事情是,默认情况下是否遵循了“安全”搜索顺序路径-这意味着当前目录不是顺序中的#2。