无法加载文件或程序集“XXX,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。

8

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

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: 使用主机配置文件: LOG: 使用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config 中的计算机配置文件。 LOG: 策略后引用: ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null LOG: GAC 查找失败。 LOG: 尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1.DLL。 LOG: 尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1/ClassLibrary1.DLL。 LOG: 尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1.EXE。 LOG: 尝试下载新的 URL 文件:///I:/Projects/ACE Explorer/AceV_1Explorer/AceExplorer/AceExplorer/bin/Debug/ClassLibrary1/ClassLibrary1.EXE。 LOG: 所有探测到的 URL 均尝试失败。

我在目录中看到了该文件,并且所有使用x86 的目标框架都是4.0

有没有办法找出问题在哪里?

更新 对于造成混淆的问题,我很抱歉。在日志中,PublicKeyToken=null。我什么方法都试过了。

更新 我在主程序中添加了一些代码,使用 ResolveEventHandler 解析程序集。起初它并没有起作用。但是当我让程序在开始时加载这些外部程序集(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;
        }

另外,不确定是否有所不同,但这是具有完全信任的ClickOnce。

此外,我们的桌面系统比较严格。

所有项目都设置为x86平台。


2
您的错误消息提到了一个名为“XXX”的未签名程序集,而Fusion正在尝试加载一个名为ClassLibrary1的已签名程序集。请您能否发布确切的错误消息 - 如果以上是确切的错误消息,那么您的问题就在这里了! - RB.
RB,眼力不错,但那并不是答案。我尝试在发布错误消息后对程序集进行强名称处理,然后显示日志。 - H20rider
那么,在这种情况下,错误很明显——Fusion在尝试的任何位置都找不到DLL。您是否尝试将这些位置复制并粘贴到Windows资源管理器中,以确保它确实在您认为的位置? - RB.
文件已经存在。我还使用了一个工具来确定它是32位还是64位。 - H20rider
文件在哪里?它在这4个位置中的哪一个? - RB.
显示剩余3条评论
1个回答

6

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

这个问题需要进行心灵调试。Fusion 被要求解析 I: 驱动器上的路径。这通常是指文件服务器上的共享映射驱动器号。而且通常会出现问题,就像这样。鉴于安全性的过度关注,ACE 可能是 访问控制项 的首字母缩写。这使得程序可能使用模拟身份验证来“探索”访问权限。这使得 Fusion 无法确定 I: 驱动器可能指的是什么,因为驱动器映射是每个用户的设置。

在程序早期运行时,它还使用默认用户令牌,因此可以正常工作。一旦程序部署后,它就有了一个稳定的位置,不再依赖于驱动器号映射,因此也可以正常工作。

我是日内瓦程序员权利公约的创始成员,对于推荐什么我不是很确定。该公约要求程序员可以在本地驱动器上创建和测试程序,并安装需要的调试工具以查找程序为何不起作用的原因。这是您的IT工作人员需要解决的问题。如果这样做可以让您重新掌控开发机器,那么您就领先了。根据谷歌搜索“.net debug project on mapped drive”查询的结果,这可能是一个合理的结果。


谢谢Hans。那似乎就是问题所在。我在本地运行过了,可以正常工作。你建议在启动时使用#if DEBUG来围绕加载程序集的代码吗? - H20rider
1
我没有你喜欢的建议。我强烈建议你全力恢复对开发机器的控制。如果你的能力有限,那么我想#if DEBUG可能会有所帮助。因此,使用UNC路径的AssemblyResolve事件处理程序也可以。像这样的东西可能会成为一个巨大的长期时间消耗,最好是与你的主管交谈而不是与我交流。他的工作是保持员工的生产力,祝你好运。 - Hans Passant

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