Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么.NET应用程序不加载添加到PATH环境变量的文件夹中的程序集?_C#_.net_Dll - Fatal编程技术网

C# 为什么.NET应用程序不加载添加到PATH环境变量的文件夹中的程序集?

C# 为什么.NET应用程序不加载添加到PATH环境变量的文件夹中的程序集?,c#,.net,dll,C#,.net,Dll,我有一个.Net应用程序,它使用了几个.Net dll,这些dll位于PATH环境变量中包含的文件夹中,但是当我启动.Net应用程序时,如果出现错误,则: 无法加载文件或程序集“FxDoc.dll,版本=1.2.10.0,区域性=中性,PublicKeyToken=1b44e1d4261664821”或其依赖项之一。系统找不到指定的文件。 我已经阅读了这些MSDN条目和 其中指出: Windows然后按以下顺序搜索DLL: 当前进程的可执行模块所在的目录 定位 当前目录 Windows系统目录。

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

无法加载文件或程序集“FxDoc.dll,版本=1.2.10.0,区域性=中性,PublicKeyToken=1b44e1d4261664821”或其依赖项之一。系统找不到指定的文件。

我已经阅读了这些MSDN条目和

其中指出:

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

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

当前目录

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

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

PATH环境变量中列出的目录

我的问题是:

  • 哪些因素可能导致此错误
  • 上述信息对.Net有效吗

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

    我将检查此链接并检查环境的GetAssembly()位置和CurrentDomain.BaseDirectory:

    这也是一个很好的链接:


    最后,可能错误的根本原因不是.dll本身,而是它所依赖的某个其他.dll。使用MS Dependency Walker查看.exe和.dll以查找程序集加载失败的疑难解答不会有什么坏处-


    CLR不使用PATH搜索程序集-您的链接用于加载本机映像。请查看这一个:

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

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

  • 全局程序集缓存(GAC)
  • 其他位置的一长串列表(包括应用程序基目录,以及取决于区域性的各种子目录等)
  • 环境变量路径不用于.NET程序集。对于所有令人毛骨悚然的细节,您可能需要查看官方文档:

    在我工作过的大多数地方,人们都坚持基本原则——要么将程序集放入GAC,要么将其放置在与应用程序相同的目录中

    您可能还对这个工具(fuslogvw.exe)感兴趣,它可以帮助您找出加载程序找不到程序集的原因:


    这有一个强名称吗?问题是否可能是由于FxDoc.DLL所依赖的不同DLL造成的?@Arun该DLL没有任何字符串名称,并且在系统中仅存在一个副本(100%确定)。显然不是:。链接建议使用网络反射器。。。但当他们开始冲锋的时候我对RedGate很反感。。。并删除了安装在硬盘上的Reflector的任何较旧的可用(免费)版本。尽管如此,我相信我给你的链接应该为你指明了正确的方向。这个工具,MS“Assembly Binding Log Viewer”,可能也会有所帮助:是否可以向-NET用于搜索程序集的位置列表(不是GAC)添加特定路径?不,不太可能。我建议您要么简单地将FxDoc.dll复制到应用程序的文件夹中,要么使用gacutil.exe将文件安装到GAC中。+1从不知道.Net dll与Win32 dll没有相同的规则。非常感谢。微软是不是故意想迷惑人们?所以现在dll不再是dll了。为什么他们没有为.net dll文件使用不同的扩展名。比如.netdll。无论如何,很高兴知道,谢谢约翰。