设置DefaultDllImportSearchPaths的SafeDirectories标志时的目录范围及疑问
1. "用户目录"的具体指向
DllImportSearchPath.SafeDirectories(值4096)中提到的"用户目录",指的是当前登录用户的Profile根目录,对应系统环境变量%USERPROFILE%,比如Windows系统中通常是C:\Users\<你的用户名>。
这个目录是用户配置文件的顶层目录,并非其下的子目录(比如Documents、AppData)。你可以通过在代码中输出Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)的值确认具体路径,将测试DLL放在该路径下即可验证是否会被搜索到。
2. 为何仅应用程序目录下的DLL能被加载
当指定DllImportSearchPath.SafeDirectories作为搜索路径时,Windows会完全使用该枚举定义的路径集合,而非默认搜索顺序。默认搜索顺序确实包含PATH环境变量目录,但SafeDirectories枚举并未将PATH纳入搜索范围——它仅限定了三个路径:应用程序目录、%WinDir%\System32、用户Profile目录。
这就是测试中只有应用程序可执行文件旁的DLL能加载的原因:要么你未将DLL放到System32或用户Profile目录,要么这两个目录里没有目标DLL,而PATH目录根本不在当前搜索范围内。
如果需要让PATH目录也被纳入搜索,可将DllImportSearchPath.SafeDirectories与DllImportSearchPath.PathDirectory枚举值进行按位或操作,这样搜索路径会同时包含SafeDirectories的三个目录和PATH环境变量中的目录。
内容的提问来源于stack exchange,提问作者glopes

