VS2017 安装 Qt 插件出错(Microsoft.VisualStudio.Threading 版本不符)

出错原因

为 VS2017 安装 Qt 插件,插件版本号为 2.3.2(截止 2019.03.13 为最新版)。安装完成打开 VS 时弹窗提示安装失败,详细信息需要查看一个给出详细路径的 ActivityLog.xml 文件。因为出错当时忘记截图了,所以这里的弹窗无图可看。

根据路径找到 ActivityLog.xml 文件,用浏览器打开,找到出错信息如下所示:
出错信息
即:

SetSite failed for package [Vsix]Source: ‘QtVsTools’ Description: 未能加载文件或程序集“Microsoft.VisualStudio.Threading, Version=15.8.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。

初步可知安装失败的原因是找不到版本号为 15.8.0.0 的 Microsoft.VisualStudio.Threading 文件或程序集。

在系统中查找文件名为 Microsoft.VisualStudio.Threading 的文件,可知文件存在且其为 .dll 文件:
在这里插入图片描述查看其版本号为 15.6.27.12746:
在这里插入图片描述
至此,可知安装出错为系统的 Microsoft.VisualStudio

SetSite failed for package [GitCodeLensShowPackage]Source: 'GitLineCodeLens' Description: 未能加载文件或程序集“Microsoft.VisualStudio.Threading, Version=17.14.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。 System.IO.FileNotFoundException: 未能加载文件或程序集“Microsoft.VisualStudio.Threading, Version=17.14.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。 文件名:Microsoft.VisualStudio.Threading, Version=17.14.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” 在 GitCodeLensShow.GitCodeLensShowPackage.InitializeAsync(CancellationToken cancellationToken, IProgress`1 progress)Microsoft.VisualStudio.Shell.AsyncPackage.<>c__DisplayClass17_0.<<Microsoft-VisualStudio-Shell-Interop-IAsyncLoadablePackageInitialize-Initialize>b__1>d.MoveNext() --- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()Microsoft.VisualStudio.Services.VsTask.RethrowException(AggregateException e)Microsoft.VisualStudio.Services.VsTask.InternalGetResult(Boolean ignoreUIThreadCheck) 警告: 程序集绑定日志记录被关闭。 要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1。 注意: 会有一些与程序集绑定失败日志记录关联的性能损失。 要关闭此功能,请移除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。
08-26
System.NullReferenceException 未将对象引用设置到对象的实例。 在 Microsoft.VisualStudio.DesignTools.Xaml.LanguageService.ResourceResolver.ResourceResolverHelper.<ResolveResourceReferenceAsync>d__24.MoveNext() --- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)Microsoft.VisualStudio.DesignTools.Utility.ThreadHelperBase.<>c__DisplayClass20_0`1.<<RunWithUIReentrancy>b__0>d.MoveNext() --- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)Microsoft.VisualStudio.Threading.JoinableTask.CompleteOnCurrentThread()Microsoft.VisualStudio.DesignTools.Utility.ThreadHelperBase.RunWithUIReentrancy[T](Func`1 func, CancellationToken cancellationToken, Boolean configureAwait)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.Utility.DesignerResourceResolverHelper.ResolveResourceReference(IXamlResourceService xamlResourceService, IModernDocumentRootResolver resolver, DocumentNode resourceReferenceNode, Nullable`1 theme, Boolean avoidDocumentParse)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.ViewModel.SceneNode.get_HasErrors()Microsoft.VisualStudio.DesignTools.SurfaceDesigner.ViewModel.SceneNode.get_RequiresNotification()Microsoft.VisualStudio.DesignTools.XamlSurfaceDesigner.Views.XamlSceneView.GetSceneNodeWithNotifications()Microsoft.VisualStudio.DesignTools.XamlSurfaceDesigner.Views.NotificationsAdornerSceneNodeSetFactory.CreateInstance(AdornerLayer adornerLayer, IList`1 adornerSceneNodeSets, AdornerSceneNodeSetCreationContext context)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.Views.AdornerLayer.GetAdornerSceneNodeSets(AdornerSceneNodeSetCreationContext adornerSceneNodeSetCreationContext)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.Views.AdornerLayer.<>c__DisplayClass63_0.<RebuildAdornerSets>b__0()Microsoft.VisualStudio.DesignTools.Utility.ProtectionZone.TrueProtectionZone.Execute(Action action)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.Views.AdornerLayer.RebuildAdornerSets(Tool activeTool)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.Tools.Tool.RebuildAdornerSets()Microsoft.VisualStudio.DesignTools.SurfaceDesigner.Tools.Tool.ActiveSceneViewModel_EarlySceneUpdatePhase(Object sender, SceneUpdatePhaseEventArgs e)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.ViewModel.SceneUpdatePhaseEventHandler.Invoke(Object sender, SceneUpdatePhaseEventArgs e)Microsoft.VisualStudio.DesignTools.SurfaceDesigner.ViewModel.SceneViewModel.FireEarlySceneUpdatePhase(SceneUpdatePhaseEventArgs args)Microsoft.VisualStudio.DesignTools.Utility.ProtectionZone.TrueProtectionZone.Execute(Action action)
09-29
<think>我们正在解决一个特定的NullReferenceException异常,该异常出现在Microsoft.VisualStudio.DesignTools.Xaml.LanguageService.ResourceResolver.ResourceResolverHelper.ResolveResourceAsync方法中。 这种异常通常是由于尝试访问一个空引用(null)的成员(如方法、属性或字段)而引起的。 根据经验,此类问题可能由多种原因引起,包括但不限于: 1. 资源引用路径错误或资源不存在。 2. XAML解析过程中的时序问题(例如在资源未完全加载时尝试解析)。 3. Visual Studio本身的bug或扩展冲突。 4. 项目配置问题(如目标框架版本不匹配)。 下面我们将逐步排查: ### 步骤1: 确认资源引用的正确性 检查出现异常的XAML文件中资源引用的路径是否正确,确保引用的资源键存在且拼写无误。例如: ```xaml <Button Background="{StaticResource NonExistentBrush}" /> ``` 如果`NonExistentBrush`不存在,则可能引发此类异常。 ### 步骤2: 清理和重建解决方案 有时编译生成的文件可能损坏,导致设计时解析失败。尝试以下操作: 1. 清理解决方案(菜单:生成 -> 清理解决方案) 2. 重新生成解决方案(生成 -> 重新生成解决方案) ### 步骤3: 重置Visual Studio设置 损坏的Visual Studio设置可能导致此问题。可以通过以下命令重置设置(不影响代码): ``` devenv /ResetSettings ``` 或者通过Visual Studio安装程序修复Visual Studio。 ### 步骤4: 禁用扩展 某些第三方扩展可能与XAML设计器冲突。尝试在安全模式下启动Visual Studio(禁用所有扩展): ``` devenv /SafeMode ``` 如果问题在安全模式下消失,则逐个禁用扩展以找出冲突的扩展。 ### 步骤5: 检查项目目标框架 确保所有项目的目标框架一致且受支持。例如,如果你的解决方案中有一个类库项目和一个WPF应用程序项目,请确保它们的目标框架相同(如.NET Core 3.1,.NET 5.0等)。 ### 步骤6: 更新Visual Studio 确保使用最新版本的Visual Studio,微软可能已在更新中修复该问题。 ### 步骤7: 检查ActivityLog Visual Studio的ActivityLog可能包含更详细的错误信息。打开ActivityLog的方法: 1. 在Windows搜索栏输入`%APPDATA%`,进入`..\Roaming\Microsoft\VisualStudio\<version>\` 2. 打开`ActivityLog.xml`文件,搜索错误信息或异常发生的时间点附近的记录。 ### 步骤8: 手动加载设计器程序集(高级) 在某些情况下,设计器所需的程序集未能正确加载。可以尝试在XAML设计器加载前强制加载程序集: 在App.xaml.cs的构造函数中添加如下代码(适用于WPF): ```csharp public App() { // 替换成实际缺失的程序集名称 Assembly.Load("Microsoft.VisualStudio.DesignTools, Version=16.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx"); } ``` 注意:需要根据实际版本和公钥令牌调整。 ### 步骤9: 反馈给微软 如果以上步骤均无效,可能是Visual Studio的bug,建议通过[Visual Studio开发者社区](https://developercommunity.visualstudio.com/)反馈。 --- ### 相关问题 1. 如何诊断Visual Studio中XAML设计器加载失败的问题? 2. 在Visual Studio中调试设计时异常有哪些技巧? 3. NullReferenceException在WPF/Silverlight开发中常见的触发场景有哪些? 4. 如何避免XAML设计时资源解析错误? </think>针对 `System.NullReferenceException: 未将对象引用设置到对象的实例` 异常出现在 `Microsoft.VisualStudio.DesignTools.Xaml.LanguageService.ResourceResolver.ResourceResolverHelper.ResolveResourceReferenceAsync` 方法的问题,以下是系统排查和解决方案: --- ### **根本原因分析** 此异常通常由以下场景触发: 1. **资源引用失效** XAML 中引用的静态资源(如 `{StaticResource key}`)在设计时未被加载或键名错误[^1]。 2. **程序集加载失败** `ResourceResolver` 依赖的设计时程序集(如 `Microsoft.Xaml`)未正确加载或版本冲突[^2]。 3. **异步时序冲突** `ResolveResourceReferenceAsync` 在资源未初始化前被调用(常见于复杂数据绑定场景)[^3]。 --- ### **逐步解决方案** #### **1. 验证资源引用有效性** ```xml <!-- 检查资源字典中的键名是否匹配 --> <ResourceDictionary> <SolidColorBrush x:Key="CorrectKey" Color="Red"/> <!-- 确保Key存在 --> </ResourceDictionary> <!-- 使用处 --> <Button Background="{StaticResource CorrectKey}"/> <!-- 键名必须完全一致 --> ``` **操作**: - 在 XAML 文件全局搜索 `StaticResource`/`DynamicResource` - 确认每个 `x:Key` 在合并的资源字典中唯一存在 #### **2. 清理和重建解决方案** ```powershell # 管理员权限执行 devenv /ResetSettings # 重置VS配置 devenv /UpdateConfiguration # 重置MSBuild配置 ``` **操作顺序**: 1. 关闭 Visual Studio 2. 删除项目目录下的 `bin`、`obj` 文件夹 3. 执行上述命令后重启 VS 4. 菜单 → 生成 → 重新生成解决方案 #### **3. 修复程序集加载** ```xml <!-- 检查项目文件(.csproj)是否包含设计时程序集 --> <ItemGroup> <PackageReference Include="Microsoft.VisualStudio.DesignTools" Version="17.0.0" /> <PackageReference Include="Microsoft.Xaml.Behaviors" Version="1.1.39" /> </ItemGroup> ``` **操作**: - 在 NuGet 包管理器中更新所有 `Microsoft.VisualStudio.DesignTools` 相关包 - 确保所有项目目标框架一致(如均为 `.NET 6.x`) #### **4. 诊断异步加载时序** ```csharp // 在App.xaml.cs中添加调试钩子 protected override void OnStartup(StartupEventArgs e) { PresentationTraceSources.DataBindingSource.Listeners.Add( new ConsoleTraceListener()); // 捕捉绑定失败日志 base.OnStartup(e); } ``` **调试步骤**: 1. 设置断点至 `ResourceResolverHelper.ResolveResourceReferenceAsync` 2. 检查调用堆栈中前置方法的 `resourceKey` 参数值 3. 确认资源字典加载顺序(`MergedDictionaries` 顺序影响解析) --- ### **高级修复方案** #### **方案1:强制同步加载** ```csharp // 重写资源解析逻辑(适用于WPF) public class CustomResourceResolver : ResourceResolver { public override Task<object> ResolveResourceAsync(string resourceKey) { var resource = Application.Current.TryFindResource(resourceKey); return resource != null ? Task.FromResult(resource) : base.ResolveResourceAsync(resourceKey); } } // 注册到设计时容器 DesignerProperties.GetResources = () => new CustomResourceResolver(); ``` #### **方案2:绕过设计时解析** ```xml <!-- 在XAML文件头部添加指令 --> <mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> <!-- 对问题资源添加设计时豁免 --> <Button Background="{Binding Source, d:IsDesignTimeCreatable=False}" /> ``` --- ### **验证结果** 1.VS 菜单启用诊断日志: **工具** → **选项** → **XAML 设计器** → **输出窗口日志级别=详细** 2. 检查输出窗口是否存在以下关键日志: - `[ResourceResolver] Resolved resource [key]`(成功) - `[ResourceResolver] FAILED to resolve [key]`(失败定位) --- ### **相关问题** 1. 如何在 Visual Studio 中启用 XAML 设计时绑定的实时诊断? 2. `MergedDictionaries` 加载顺序如何影响资源解析? 3. 如何为自定义控件配置设计时资源? 4. .NET 6+ 项目迁移后出现 XAML 设计器崩溃的通用修复方案有哪些? [^1]: XAML 静态资源引用规范与键名解析机制。 [^2]: Visual Studio 设计时程序集加载依赖链分析。 [^3]: 异步资源解析在 WPF/UWP 中的时序问题诊断。
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值