我一直在尝试调试这个错误:
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平台。