VSIX项目在VS≥15.5版本中缺失Newtonsoft.Json的解决方案咨询
解决VSIX包在VS 15.5+中缺失Newtonsoft.Json.dll导致运行异常的问题
我之前处理过完全相同的问题:VS 15.4及更早版本,生成的VSIX包会自动包含Newtonsoft.Json.dll,但从15.5开始,微软在C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\VSSDK\Microsoft.VsSDK.targets里新增了排除规则,把这个dll从包中移除了,直接导致依赖它的VSIX在高版本VS里运行报错。
下面是几个经过验证的可行解决方案,按推荐程度排序:
方案1:修改项目文件强制包含dll(最推荐)
这个方法直接在项目层面覆盖targets的排除规则,不会影响全局设置,也不怕VS更新覆盖:
- 右键你的VSIX项目 → 「卸载项目」
- 右键卸载后的项目 → 「编辑xxx.csproj」(或xxx.vbproj)
- 在文件末尾的
</Project>标签之前,插入这段XML代码:
<ItemGroup> <VSIXCopyLocalAssemblies Include="Newtonsoft.Json.dll"> <DestinationSubDirectory>Assemblies</DestinationSubDirectory> </VSIXCopyLocalAssemblies> </ItemGroup>
- 保存文件,重新加载项目,再重新生成VSIX包
这样编译后的包会自动把Newtonsoft.Json.dll放到Assemblies目录下,安装后就能被正确加载。
方案2:检查并调整引用属性
有时候是引用的Copy Local属性没设置对,导致dll没被复制到输出目录:
- 在项目的「引用」节点下找到
Newtonsoft.Json,右键 → 「属性」 - 确保「复制本地」设置为
True - 如果你想更稳妥,可以直接编辑项目文件,确认引用的
Private属性是True(对应复制本地):
<Reference Include="Newtonsoft.Json, Version=你的版本号, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <HintPath>..\packages\Newtonsoft.Json.版本号\lib\net45\Newtonsoft.Json.dll</HintPath> <Private>True</Private> </Reference>
如果Private是False,改成True即可。
方案3:添加绑定重定向解决版本冲突
如果VS 15.5+本身自带了Newtonsoft.Json,但版本和你项目依赖的不一致,可能会出现加载异常,这时候可以加绑定重定向:
- 如果项目没有
app.config文件,右键项目 → 「添加」→ 「新建项」→ 选择「应用程序配置文件」 - 在
app.config中添加以下内容(替换版本号为你实际依赖的版本):
<configuration> <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> </configuration>
这样VS会优先加载你打包的版本,避免版本不兼容问题。
方案4:修改全局targets文件(不推荐)
这个方法需要管理员权限,而且VS更新后会被覆盖,仅作为应急方案:
- 打开路径
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\VSSDK\Microsoft.VsSDK.targets - 查找包含
Newtonsoft.Json.dll的排除项,比如类似<ExcludeFromVSIX>Newtonsoft.Json.dll</ExcludeFromVSIX>的代码 - 注释掉或者删除这一行,保存后重新生成VSIX包
内容的提问来源于stack exchange,提问作者HLourenco
相关产品推荐
相关产品推荐

