Visual Studio 2017 - VSIX 包在更新 NuGet 包后停止工作
Visual Studio 2017 - VSIX Package stops working after updating NuGet packages
重现步骤:
- 打开 Visual Studio 2017。Select 文件..新建..项目..
- 在“新建项目”对话框中,select 可扩展性..VSIX 项目..
- Select 来自解决方案资源管理器的新项目。右键单击并添加..新项目..可扩展性..自定义命令..
- 您现在拥有了一个从标准模板构建的完整自定义命令。 运行 它在调试器中。您将获得 Visual Studio 的实验实例。从菜单中,select 工具...调用 Command1...您的自定义命令有效!
- 点击'OK'并退出Visual Studio的实验实例。
- 现在,返回原始解决方案,单击工具..NuGet 包管理器..管理解决方案的 NuGet 包...
- 在“更新”选项卡中,您会看到模板中包含的标准包有许多更新。 Select 全部更新。重复直到所有包都已更新。您可能需要在此过程中重新启动 VS。
再次构建您的 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);
}
再次调试您的 VSIX 程序包。
- Select 工具...调用命令 1...
- 您收到错误消息:'Command1Package' 包未正确加载。
如果您按照说明进入 %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' 或其依赖项之一。
有很多方法可以解决这个问题(混乱)。这是一个
- 首先,配置 Visual Studio 2017 的 Nuget 以使用新的包引用模式。 https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files:
- 删除遗留
packages.config
文件。
- 删除所有现有引用(见下图)
- 手动编辑 .csproj 并删除所有包含“..packages...”内容的行,包括检查某些 nuget 存在的所有行,以及相关的导入和任务。
- 添加
Microsoft.VisualStudio.Shell.15.0
和 Newtonsoft.Json
作为 nuget 包。您现在应该看到类似这样的内容(请注意带有蓝色图标的新 nuget 引用):
- 你应该可以编译并且运行成功
几个月来,每当我遇到不可能的 nuget 问题时,我都会这样做。我将旧的 packages.config 复制到某处,将其从项目中删除,记住 "root" 包,删除所有引用,检查 csproj,并从 nuget 添加新引用(尝试添加尽可能少的引用,以便子引用是可以的)。 Nuget 是现在所有参考文献的未来(无论我们喜欢与否,我们都必须咬紧牙关),即使是 Visual Studio 个。
重现步骤:
- 打开 Visual Studio 2017。Select 文件..新建..项目..
- 在“新建项目”对话框中,select 可扩展性..VSIX 项目..
- Select 来自解决方案资源管理器的新项目。右键单击并添加..新项目..可扩展性..自定义命令..
- 您现在拥有了一个从标准模板构建的完整自定义命令。 运行 它在调试器中。您将获得 Visual Studio 的实验实例。从菜单中,select 工具...调用 Command1...您的自定义命令有效!
- 点击'OK'并退出Visual Studio的实验实例。
- 现在,返回原始解决方案,单击工具..NuGet 包管理器..管理解决方案的 NuGet 包...
- 在“更新”选项卡中,您会看到模板中包含的标准包有许多更新。 Select 全部更新。重复直到所有包都已更新。您可能需要在此过程中重新启动 VS。
再次构建您的 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); }
再次调试您的 VSIX 程序包。
- Select 工具...调用命令 1...
- 您收到错误消息:'Command1Package' 包未正确加载。
如果您按照说明进入 %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' 或其依赖项之一。
有很多方法可以解决这个问题(混乱)。这是一个
- 首先,配置 Visual Studio 2017 的 Nuget 以使用新的包引用模式。 https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files:
- 删除遗留
packages.config
文件。 - 删除所有现有引用(见下图)
- 手动编辑 .csproj 并删除所有包含“..packages...”内容的行,包括检查某些 nuget 存在的所有行,以及相关的导入和任务。
- 添加
Microsoft.VisualStudio.Shell.15.0
和Newtonsoft.Json
作为 nuget 包。您现在应该看到类似这样的内容(请注意带有蓝色图标的新 nuget 引用):
- 你应该可以编译并且运行成功
几个月来,每当我遇到不可能的 nuget 问题时,我都会这样做。我将旧的 packages.config 复制到某处,将其从项目中删除,记住 "root" 包,删除所有引用,检查 csproj,并从 nuget 添加新引用(尝试添加尽可能少的引用,以便子引用是可以的)。 Nuget 是现在所有参考文献的未来(无论我们喜欢与否,我们都必须咬紧牙关),即使是 Visual Studio 个。