哪个DLL是[DllImport]加载?

时间:2012-12-19 10:21:52

标签: .net usb dllimport

我正在使用[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*,文件不存在。

4 个答案:

答案 0 :(得分:4)

File System Redirector将会加入:

  

%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搜索以下路径:

  1. 当前加载的DLL(如果已加载,则无需搜索文件)
  2. 当前进程的可执行模块的目录
  3. 当前目录。
  4. "系统"目录。 (即c:\ Windows \ System32)
  5. " Windows"目录。 (即c:\ Windows)
  6. PATH环境变量中列出的目录。