我一直在尝试调试此错误:
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,我收到以下消息:
日志:此绑定在默认加载上下文中启动.日志:使用应用程序配置文件:I:\ Projects\ACE Explorer\AceV_1Explorer\AceExplorer\AceExplorer\bin\Debug\AceExplorer.exe.config日志:使用主机配置文件:日志:使用来自C:\ Windows\Microsoft的计算机配置文件.NET\Framework64\v4.0.30319\CONFIG\machine.config中.日志:后策略引用:ClassLibrary1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null LOG:GAC Lookup不成功.日志:尝试下载新的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.日志:所有探测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;
}
Run Code Online (Sandbox Code Playgroud)
也.不确定这是否有所不同,但它是一个完全信任的clickonce.
我们的桌面也被锁定了.
对于所有项目,平台也设置为x86.
file:///I:/Projects/ACE Explorer/.../bin/Debug/ClassLibrary1.DLL。
这个问题需要心理调试。Fusion 被要求解析I:驱动器上的路径。这通常是文件服务器上共享的映射驱动器号。而且经常这样麻烦。鉴于对安全性的过度关注,ACE 很可能是Access Control Entry的首字母缩写词。这使得程序很可能使用模拟来“探索”访问权限。这使得 Fusion 可能无法弄清楚I:驱动器可能指的是什么,驱动器映射是每个用户的设置。
在程序早期运行正常,因为它仍然使用默认用户令牌运行。并且一旦部署程序就可以正常工作,因为它现在有一个不依赖于驱动器号映射的稳定位置。
不知道该推荐什么,我是《日内瓦程序员权利公约》的特许成员。这要求程序员可以在他们的本地驱动器上创建和测试程序,并安装他们需要的那种调试工具来找出他们的程序为什么不起作用。这是您的 IT 人员需要解决的问题。如果这让您可以控制您的开发机器,那么您就领先了。考虑到 Google 为“映射驱动器上的 .net 调试项目”查询返回的命中类型,一个可能的结果。