未能加载文件或程序集“xxx”或它的某一个依赖项。参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))

本文记录了一次项目中遇到的DLL引用错误经历。作者在遇到电脑蓝屏后, 项目无法正常运行并出现未知错误。尝试多种解决办法无效后, 最终通过替换新的DLL文件解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天正在做着项目,电脑突然蓝屏了,然后再打开项目时候就报这个错误。


百度谷歌给出的方法都不管用,删除项目重新在VSS获取编译也没用。编译时也不报错。


最后我同事重新把这个DLL给我,我重新再次引用这个DLL,问题解决。我也不清楚问题出在哪。特此记录一下



<think>我们正在处理一个关于程序集加载失败的异常。具体错误信息是: FileLoadException: 未能加载文件程序集 System.Diagnostics.Tracing 它的依赖项程序集清单定义与引用不匹配。异常 HRESULT:0x80131040 这个错误通常发生程序集版本不匹配的情况下。也就是说,应用程序期望加载一个特定版本的程序集(例如4.0.0.0),但实际找到的程序集版本(例如4.1.0.0)与之不匹配。 ### 解决方案步骤 1. **检查程序集绑定重定向(Binding Redirect)**: 在.NET应用程序中,可以通过配置文件(如`app.config``web.config`)设置绑定重定向,将旧版本的程序集重定向到新版本。检查配置文件中是否有针对`System.Diagnostics.Tracing`程序集的绑定重定向设置。如果没有,可以尝试添加。 示例绑定重定向配置: ```xml <dependentAssembly> <assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" /> </dependentAssembly> ``` 注意:`publicKeyToken`和版本号需要根据实际情况调整。可以通过查看GAC中的程序集使用工具(如ILSpy)来获取正确的版本和公钥令牌。 2. **检查程序集版本**: 使用Fusion日志查看器(Fusion Log Viewer)来查看程序集加载的详细过程。这可以帮助确定程序集加载失败的具体原因。Fusion日志可以记录程序集加载的每一步,包括查找的位置和版本信息。 启用Fusion日志的方法: - 在注册表中设置:`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion`,添加DWORD值`EnableLog`为1。 - 使用命令行工具:`fuslogvw.exe`(在Visual Studio Developer Command Prompt中运行)。 3. **清理解决方案并重新生成**: 有候,清理解决方案并重新生成可以解决一些临的构建问题。尝试以下步骤: - 关闭Visual Studio。 - 删除项目中的`bin`和`obj`文件夹。 - 重新打开解决方案并重新生成项目。 4. **检查NuGet包依赖**: 如果项目使用了NuGet包,检查是否有包引用了不同版本的`System.Diagnostics.Tracing`。可以使用NuGet包管理器查看所有包的依赖关系,并确保所有包都使用兼容的版本。 如果有多个包引用了不同版本,可能需要升级降级某些包,者通过绑定重定向来解决版本冲突。 5. **检查目标框架版本**: 确保项目的目标框架版本与程序集兼容。例如,如果项目目标是.NET Framework 4.6.1,那么使用的`System.Diagnostics.Tracing`版本应该与框架版本匹配。 6. **检查GAC中的程序集**: 如果程序集被安装到全局程序集缓存(GAC),则检查GAC中是否存在正确版本的程序集。可以使用`gacutil /l System.Diagnostics.Tracing`来查看。 7. **使用程序集解析事件**: 在代码中订阅`AppDomain.AssemblyResolve`事件,以在程序集解析失败提供自定义解析逻辑。这可以作为临解决方案,但应谨慎使用。 示例代码: ```csharp AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { string assemblyName = new AssemblyName(args.Name).Name; if (assemblyName == "System.Diagnostics.Tracing") { // 返回指定路径的程序集 return Assembly.LoadFrom(@"path\to\correct\version\System.Diagnostics.Tracing.dll"); } return null; }; ``` 8. **更新修复Visual Studio**: 有,Visual Studio本身的问题可能导致程序集加载失败。尝试更新Visual Studio到最新版本,者运行修复安装。 ### 总结 以上步骤通常可以解决程序集版本不匹配的问题。请按照顺序尝试,从最简单的步骤(如清理和重新生成)开始,逐步深入。 §§相关问题§§ 1. 如何启用Fusion日志来诊断程序集加载失败? 2. 绑定重定向(binding redirect)在.NET中的作用是什么? 3. 如何查看一个程序集的公钥令牌(publicKeyToken)?</think>### 解决 System.Diagnostics.Tracing 程序集加载失败问题 该错误表示应用程序引用的 `System.Diagnostics.Tracing` 程序集版本与实际找到的版本不匹配。以下是系统性的解决方案: #### 1. **检查绑定重定向配置** - 打开项目的 `app.config` `web.config` 文件 - 添加更新绑定重定向规则: ```xml <dependentAssembly> <assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> ``` - 版本号需根据实际引用调整(通过解决方案资源管理器 > 引用 > 查看属性) #### 2. **验证 NuGet 包一致性** - 在 NuGet 包管理器控制台中执行: ``` Update-Package -Reinstall ``` - 检查所有项目是否使用相同版本的 `Microsoft.NETCore.Targets` `System.Diagnostics.Tracing` 包 - 删除 `packages` 文件夹并重建项目(强制重新下载依赖) #### 3. **清理解决方案缓存** - 关闭 Visual Studio - 删除以下文件夹: - 项目中的 `bin` 和 `obj` 文件夹 - 解决方案根目录中的 `.vs` 隐藏文件夹 - 用户临文件夹 `%TEMP%` - 重新打开解决方案并重建 #### 4. **启用程序集加载日志** - 使用 Fusion Log Viewer (`fuslogvw.exe`): 1. 以管理员身份运行开发者命令提示符 2. 执行: ``` fuslogvw /i ``` 3. 重现错误后检查日志,确认程序集加载路径和版本[^1] #### 5. **检查目标框架兼容性** - 确保所有类库和主项目的目标框架一致(如 .NET 6.0) - 检查项目文件中的 `<TargetFramework>` `<TargetFrameworks>` 设置 #### 6. **检查 GAC 中的冲突程序集** - 运行命令查看全局程序集缓存: ``` gacutil /l System.Diagnostics.Tracing ``` - 如果存在多个版本,卸载冲突版本: ``` gacutil /u System.Diagnostics.Tracing,Version=4.0.0.0 ``` #### 替代方案(临解决) ```csharp AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var name = new AssemblyName(args.Name); return name.Name == "System.Diagnostics.Tracing" ? Assembly.Load("System.Diagnostics.Tracing, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") : null; }; ``` > **注意**:此问题通常由版本冲突引起,90% 的情况可通过绑定重定向和 NuGet 包更新解决。若问题持续,检查事件查看器中的应用程序日志获取更详细的加载错误信息。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值