为什么我的.NET应用程序无法加载位于添加到PATH环境变量的文件夹中的程序集?

8
我有一个使用了几个.Net dll的.Net应用程序,这些dll位于包含在PATH环境变量中的文件夹中。但是,当我启动我的.Net应用程序时,它会出现以下错误:
无法加载文件或程序集“FxDoc.dll,版本=1.2.10.0,Culture=neutral,PublicKeyToken=1b44e1d4261664821”或其某一个依赖项。系统找不到指定的文件。

我已经阅读了这些MSDN条目 Windows用于定位DLL的搜索路径动态链接库搜索顺序

其中说明:

Windows会按照以下顺序搜索DLL:

当前进程可执行模块所在的目录。

当前目录。

Windows系统目录。GetSystemDirectory函数检索此目录的路径。

Windows目录。GetWindowsDirectory函数检索此目录的路径。

在PATH环境变量中列出的目录。

我的问题是:

  1. 可能导致此错误的因素有哪些?
  2. 上述信息对.Net是否有效?

这个有强名称吗?问题可能是由于FxDoc.dll依赖的不同DLL引起的吗? - Arun
@Arun,这些dll文件没有任何字符串名称,并且在系统中只存在一份副本(100%确定)。 - Salvador
3个回答

20

.NET程序集和旧版DLL的规则不同。您列出的规则适用于旧版DLL。

程序集加载非常复杂,但基本搜索顺序如下:

  1. 全局程序集缓存(GAC)
  2. 其他位置的长列表(包括应用程序基目录和各种子目录,具体取决于区域设置等等...)

环境变量PATH不用于.NET程序集。有关详细信息,您可能需要查看官方文档:

http://msdn.microsoft.com/en-us/library/aa720133.aspx

我工作过的大多数地方都遵循基本原则——程序集要么放入GAC中,要么放在与应用程序相同的目录中。

您还可能对这个工具(fuslogvw.exe)感兴趣,该工具可以帮助您弄清楚加载器为什么找不到程序集:

http://msdn.microsoft.com/en-us/library/e74a18c4.aspx


是否可以将特定路径添加到.NET用于搜索程序集的位置列表(非GAC)中? - Salvador
不,其实不用。我建议你要么只是将 FxDoc.dll 复制到你的应用程序文件夹中,要么使用 gacutil.exe 将该文件安装到 GAC 中。 - JohnD
3
+1 从来不知道 .Net DLL 和 Win32 DLL 的规则不同。谢谢! - Arun
2
微软是故意想要混淆人们吗?现在一个dll不再是一个dll了。为什么他们不用不同的扩展名来命名.net dll文件,比如说.netdll呢?无论如何,感谢JohnD让我们知道这个。 - Paul McCarthy

2
可能有几个因素在起作用,包括(相对较新的)注册表参数“SafeDllSearchMode”。您可以在此处获得完整的详细信息:

http://msdn.microsoft.com/en-us/library/ms682586%28v=vs.85%29.aspx

我会检查此链接,并检查诸如您的环境的GetAssembly().Location和CurrentDomain.BaseDirectory之类的内容: 如何获取代码所在程序集的路径? 这也是一个非常好的链接:

http://blogs.msdn.com/b/aymans/archive/2006/04/04/568466.aspx

最后,可能导致错误的根本原因不是你的.dll本身,而是它依赖的其他.dll。使用MS Dependency Walker查看你的.exe和.dll可能会有所帮助。

显然不是这样的:https://dev59.com/pnVC5IYBdhLWcg3wpSzf。该链接推荐使用Net Reflector...但当RedGate开始收费并删除在您的硬盘上安装的任何旧版本(免费!)的Reflector时,我感到厌恶。尽管如此,我相信我给你的链接应该会指引你朝着正确的方向前进。 - paulsm4
这个工具,MS“程序集绑定日志查看器”,也可能有所帮助:http://msdn.microsoft.com/en-us/library/e74a18c4%28VS.71%29.aspx - paulsm4

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接