从VS包连接TFS17时遇MissingMethodException问题求助
解决Visual Studio扩展连接TFS 2017时的MissingMethodException问题
我之前也碰到过几乎一模一样的问题,这个坑的核心原因是Visual Studio宿主环境自带的程序集(尤其是Newtonsoft.Json)和你的扩展引用的版本冲突——控制台应用没有这个宿主环境的限制,所以能正常跑,但VS扩展会被宿主的程序集加载规则干扰。下面是亲测有效的解决步骤:
1. 强制配置程序集绑定重定向
VS扩展默认不会自动应用app.config里的绑定重定向,因为VS本身有一套自己的程序集加载优先级。你需要手动确保重定向规则生效:
- 打开项目的
app.config,添加明确的Newtonsoft.Json绑定重定向(替换成你实际引用的版本):<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> - 然后打开
source.extension.vsixmanifest的Assets标签,确认Newtonsoft.Json被列为“Microsoft.VisualStudio.Assembly”类型的资产,并且版本正确。
2. 在Package初始化时手动指定程序集加载
如果绑定重定向还是不生效,可以在你的Package类的Initialize方法里加一段代码,强制加载扩展包自带的Newtonsoft.Json,绕过VS宿主的加载:
using System; using System.IO; using System.Reflection; using Microsoft.VisualStudio.Shell; public sealed class YourExtensionPackage : Package { protected override void Initialize() { // 处理Newtonsoft.Json的程序集加载冲突 AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name); if (string.Equals(assemblyName.Name, "Newtonsoft.Json", StringComparison.OrdinalIgnoreCase)) { // 加载扩展自身目录下的Newtonsoft.Json.dll var extensionDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var targetPath = Path.Combine(extensionDir, "Newtonsoft.Json.dll"); return File.Exists(targetPath) ? Assembly.LoadFrom(targetPath) : null; } return null; }; // 你的其他初始化逻辑 base.Initialize(); } }
3. 确认VSIX打包的依赖完整性
有时候VS打包VSIX时会漏掉依赖的程序集,要检查这几点:
- 右键扩展项目 → 属性 → 生成,把
Newtonsoft.Json、Microsoft.VisualStudio.Services.WebApi等相关程序集的“复制本地”设置为True。 - 把生成的VSIX文件改成.zip后缀,解压后检查里面是否包含了正确版本的
Newtonsoft.Json.dll和所有需要的依赖。
4. 匹配VSTS SDK和VS版本
TFS 2017对应的VSTS SDK版本要和你开发扩展用的VS版本匹配,比如VS 2017对应的SDK版本是15.x系列,不要用过高的版本(比如16.x+),否则容易出现兼容问题。
内容的提问来源于stack exchange,提问作者blinkettaro
相关产品推荐
相关产品推荐

