Visual Studio 2017 - VSIX 包在更新 NuGet 包后停止工作

Visual Studio 2017 - VSIX Package stops working after updating NuGet packages

重现步骤:

  1. 打开 Visual Studio 2017。Select 文件..新建..项目..
  2. 在“新建项目”对话框中,select 可扩展性..VSIX 项目..
  3. Select 来自解决方案资源管理器的新项目。右键单击并添加..新项目..可扩展性..自定义命令..
  4. 您现在拥有了一个从标准模板构建的完整自定义命令。 运行 它在调试器中。您将获得 Visual Studio 的实验实例。从菜单中,select 工具...调用 Command1...您的自定义命令有效!
  5. 点击'OK'并退出Visual Studio的实验实例。
  6. 现在,返回原始解决方案,单击工具..NuGet 包管理器..管理解决方案的 NuGet 包...
  7. 在“更新”选项卡中,您会看到模板中包含的标准包有许多更新。 Select 全部更新。重复直到所有包都已更新。您可能需要在此过程中重新启动 VS。
  8. 再次构建您的 VSIX 程序包。您可能必须取消围绕此语句的警告:

    public static async Task InitializeAsync(AsyncPackage package)
    {
        // Verify the current thread is the UI thread - the call to AddCommand in Command1's constructor requires
        // the UI thread.
    #pragma warning disable VSTHRD109 // Switch instead of assert in async methods
        ThreadHelper.ThrowIfNotOnUIThread();
    #pragma warning restore VSTHRD109 // Switch instead of assert in async methods
    
        OleMenuCommandService commandService = await package.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;
        Instance = new Command1(package, commandService);
    }
    
  9. 再次调试您的 VSIX 程序包。

  10. Select 工具...调用命令 1...
  11. 您收到错误消息:'Command1Package' 包未正确加载。
  12. 如果您按照说明进入 %AppData% 目录并阅读 activity 日志,您将看到 Microsoft.VisualStudio.Threading 15.8.0.0 程序集无法已加载。

    无法加载文件或程序集 'Microsoft.VisualStudio.Threading, Version=15.8.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。该系统找不到指定的文件。 System.IO.FileNotFoundException: 无法加载文件或程序集 'Microsoft.VisualStudio.Threading, Version=15.8.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。

有很多方法可以解决这个问题(混乱)。这是一个

  • 删除遗留 packages.config 文件。
  • 删除所有现有引用(见下图)
  • 手动编辑 .csproj 并删除所有包含“..packages...”内容的行,包括检查某些 nuget 存在的所有行,以及相关的导入和任务。
  • 添加 Microsoft.VisualStudio.Shell.15.0Newtonsoft.Json 作为 nuget 包。您现在应该看到类似这样的内容(请注意带有蓝色图标的新 nuget 引用):

  • 你应该可以编译并且运行成功

几个月来,每当我遇到不可能的 nuget 问题时,我都会这样做。我将旧的 packages.config 复制到某处,将其从项目中删除,记住 "root" 包,删除所有引用,检查 csproj,并从 nuget 添加新引用(尝试添加尽可能少的引用,以便子引用是可以的)。 Nuget 是现在所有参考文献的未来(无论我们喜欢与否,我们都必须咬紧牙关),即使是 Visual Studio 个。