我正在使用[DllImport]
属性将本机DLL导入我的应用程序,但它加载的DLL不在本地bin文件夹中。它是从系统的其他地方加载的,但我无法解决问题。
它适用于我的开发机器,但不适用于干净机器。
我启用了Fusion日志记录,只显示了托管程序集。
我已经使用Sysinternals Process Explorer转储了这个进程,而且告诉我它在C:\Windows\System32
中,但我在Windows资源管理器中看不到该文件。
值得注意的是,我正在运行64位Windows 7,但DLL只支持x86,所以我不得不强迫我的应用程序做x86。是否有某种重定向会改变从哪里加载x86文件?
DllImport是一款定制的Silicon Labs USB驱动程序。 [的DllImport( “SiUSBXp.dll”)]
我还使用命令提示符在System32文件夹中执行dir si*
,文件不存在。
答案 0 :(得分:4)
%windir%\ System32目录是为64位应用程序保留的。创建64位版本的DLL时,大多数DLL文件名都没有更改,因此32位版本的DLL存储在不同的目录中。 WOW64通过使用文件系统重定向器来隐藏这种差异。
在大多数情况下,只要32位应用程序尝试访问%windir%\ System32,就会将访问权限重定向到%windir%\ SysWOW64。
所以即使进程认为它加载了来自System32
的DLL,它也可能是从SysWOW64
加载的。是的,这些数字是你所期望的错误方式。
答案 1 :(得分:2)
DllImport背后的实际源代码在这里:
https://github.com/gbarnett/shared-source-cli-2.0/blob/master/clr/src/vm/dllimport.cpp
如您所见,它首先尝试在.Net的内部缓存中找到de unmanaged library。
如果失败,但指定了绝对路径,则会使用该路径加载库。
如果未指定绝对路径,则会在以下位置查找:
1)包含包含DllImport的程序集的清单文件的文件夹。
2)在Assembly.CodeBase中指定的文件夹。
3)LoadLibraryExW所在的所有地方。
如果全部失败,它会尝试将其解释为" filename,assemblyname"。
然后它将库添加到其内部缓存中。
答案 2 :(得分:1)
您想要阅读此内容 - LoadLibrary function,并且您也希望阅读此Dynamic Link Library Search Order。
注意 - 这些与本机Win32 API有关,但它是[DllImport]
属性使用的那个。
该文件可能未在资源管理器中显示,因为您需要打开“显示所有文件” - 许多常见的[DllImport]
指令(例如kernel32
)都是针对Win32 DLL,它们被归类为操作系统文件因此默认隐藏。
答案 3 :(得分:1)
DLLImport
搜索以下路径: