【问题标题】:Why my .NET App does not load an assembly located in a folder added to the PATH environment variable?为什么我的 .NET 应用程序不加载位于添加到 PATH 环境变量的文件夹中的程序集?
【发布时间】:2011-11-12 14:41:13
【问题描述】:

我有一个使用几个 .Net dll 的 .Net 应用程序,这些 dll 位于 PATH 环境变量中包含的文件夹中,但是当我启动 .Net 应用程序时如果失败并出现错误:

Could not load file or assembly 'FxDoc.dll, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d4261664821' or one of its dependencies. The system cannot find the file specified.

我已经阅读了这些 MSDN 条目 Search Path Used by Windows to Locate a DLLDynamic-Link Library Search Order

其中规定:

Windows 然后按以下顺序搜索 DLL:

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

当前目录。

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

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

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

我的问题是:

  1. 哪些因素可能导致此错误?
  2. 以上信息对.Net有效吗?

【问题讨论】:

  • 这有一个强名称吗?问题是否有可能是由于 FxDoc.dll 所依赖的不同 DLL 造成的?
  • @Arun dll 没有任何字符串名称,系统中只存在一份副本(100% 确定)。

标签: c# .net dll


【解决方案1】:

.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)?
  • 不,不是。我建议要么简单地将 FxDoc.dll 复制到应用程序的文件夹中,要么使用 gacutil.exe 将文件安装到 GAC 中。
  • +1 从来不知道 .Net DLL 没有与 Win32 DLL 相同的规则。谢谢!
  • 微软是在故意迷惑人吗?所以现在一个 dll 不再是一个 dll 了。为什么他们不为 .net dll 文件使用不同的扩展名。可能像.netdll。无论如何,很高兴知道,谢谢 JohnD。
【解决方案2】:

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

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

我会检查此链接并检查您的环境的 GetAssembly().Location 和 CurrentDomain.BaseDirectory 等内容:

How do I get the path of the assembly the code is in?

这也是一个很好的链接:

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

最后,错误的根本原因可能不是您的 .dll 本身,而是它所依赖的其他 .dll。使用 MS Dependency Walker 查看您的 .exe 和 .dll 不会有什么坏处

【讨论】:

【解决方案3】:

用于解决程序集加载故障 - http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx

CLR 不使用 PATH 搜索程序集 - 您的链接用于加载本机图像。看看这个:http://msdn.microsoft.com/en-us/library/yx7xezcf(v=VS.100).aspx

【讨论】:

    猜你喜欢
    • 2019-04-08
    • 2019-06-13
    • 2016-10-20
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多