【问题标题】:Could not load file or assembly 'XXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies无法加载文件或程序集“XXX,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一
【发布时间】:2016-05-06 21:24:36
【问题描述】:

我一直在尝试调试这个错误:

System.IO.FileNotFoundException:无法加载文件或程序集“ClassLibrary1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。 文件名:'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'

我看到了很多解决方案并尝试了所有方法。

我正在查看 Fusion Viewer 并收到以下消息:

LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:I:\Projects\ACE Explorer\AceV_1Explorer\AceExplorer\AceExplorer\bin\Debug\AceExplorer.exe.config LOG:使用主机配置文件: 日志:使用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config 中的机器配置文件。 日志:政策后参考:ClassLibrary1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null 日志:GAC 查找不成功。 日志:正在尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1.DLL。 日志:正在尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1/ClassLibrary1.DLL。 日志:正在尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1.EXE。 日志:正在尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1/ClassLibrary1.EXE。 LOG:所有探测 URL 都已尝试并失败。

我在目录中看到文件,目标框架是 4.0,所有使用 x86 的人

找出问题所在的任何想法

更新 对困惑感到抱歉。在日志中它是 PublicKeyToken=null。我什么都试过了。

更新 我在主程序中添加了一些代码,这些代码将使用 ResolveEventHandler 解析程序集。起初它没有用。但是当我让程序在程序开始时加载那些外部程序集(LoadReferences())时,它确实可以工作。奇怪的是,当我在开头 LoadReferences() 中加载它们时路径完全相同,然后当方法输入对触发 CurrentDomain_AssemblyResolve 的自定义组合的引用时。空白路径解析为程序集路径。如您所见,在 LoadReferences() 中,我添加了 EntityFramework,这将导致同样的问题,即使我使用的是 Nuget。

在 Main() 中我添加了:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
LoadReferences();



private static void LoadReferences()
        {
            Assembly  objExecutingAssemblies;
            objExecutingAssemblies = Assembly.GetExecutingAssembly();
            AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
            Assembly asm;
            foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
            {
                if (strAssmbName.FullName.ToLower().Contains("[company].") || strAssmbName.FullName.ToLower().Contains("entityframework"))
                    asm = Assembly.LoadFrom(Path.Combine("", strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(","))+ ".dll"));


            }
            // these were also posing an issue
            asm = Assembly.LoadFrom(Path.Combine("", "EntityFramework.dll"));
            asm = Assembly.LoadFrom(Path.Combine("", "EntityFramework.SqlServer.dll"));


        }
        static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string assembliesDir = "";
            try
            {
                string dll = (args.Name.IndexOf(",") < 0 ? args.Name + ".dll" : args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
                Assembly asm = Assembly.LoadFrom(Path.Combine(assembliesDir, dll));
                return asm;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            return null;
        }

还有。不确定这是否会有所作为,但这是一次完全信任的点击。

此外,我们的桌面也被锁定了。

此外,所有项目的平台都设置为 x86。

【问题讨论】:

  • 您的错误消息是关于一个名为“XXX”的未签名程序集,而 Fusion 正在尝试加载一个名为 ClassLibrary1 的已签名程序集。请您发布 exact 错误消息 - 如果上面是确切的错误消息,那么您的问题就在那里!
  • RB,好眼力,但事实并非如此。在发布错误消息然后显示日志后,我尝试使程序集命名为强。
  • 好吧,在这种情况下,错误很明显 - Fusion 在它尝试的任何位置都找不到 DLL。您是否尝试过将位置复制并粘贴到 Windows 资源管理器中,以确保它确实是您认为的位置?
  • 文件在那里。我还尝试了一个工具来确定它是 32 位还是 64 位
  • 文件在哪里?它在 4 个位置中的哪一个?

标签: c#


【解决方案1】:

file:///I:/Projects/ACE Explorer/.../bin/Debug/ClassLibrary1.DLL。

这个问题需要心理调试。要求 Fusion 解析 I: 驱动器上的路径。这通常是文件服务器上共享的映射驱动器号。而且经常这样麻烦。鉴于对安全性的过度关注,ACE 很可能是Access Control Entry 的首字母缩写词。这使得该程序很可能使用模拟来“探索”访问权限。这使得 Fusion 可能无法确定 I: 驱动器可能指的是什么,驱动器映射是每个用户设置。

在程序的早期工作正常,因为它仍然使用默认用户令牌运行。并且一旦部署该程序就可以正常工作,因为它现在有一个不依赖于驱动器号映射的稳定位置。

不知道该推荐什么,我是《日内瓦程序员权利公约》的创始成员。这就要求程序员可以在他们的本地驱动器上创建和测试程序,并安装他们需要的调试工具来找出他们的程序为什么不能工作。这是您的 IT 人员需要解决的问题。如果这能让你控制你的开发机器,那么你就领先了。考虑到 Google 针对“映射驱动器上的 .net 调试项目”查询返回的命中类型,可能的结果。

【讨论】:

  • 谢谢汉斯。这似乎是问题所在。我在本地运行它并工作。您是否建议在启动时加载程序集的代码周围使用#if DEBUG
  • 我没有你喜欢的推荐。我建议您尽全力重新控制您的开发机器。如果你的能力很弱,那么我想#if DEBUG 可以提供帮助。使用 UNC 路径的 AssemblyResolve 事件处理程序也可以。像这样的事情可能会耗费大量的长期时间,最好与您的主管交谈而不是与我交谈。让他的员工保持高效是他的工作,祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2019-03-18
  • 2017-11-08
相关资源
最近更新 更多