我们有一个针对vsix项目的解决方案。直到15.4版的visual studio软件包都是用newtonsoft.json.dll生成的,但是从那个版本开始,newsoft被排除在软件包之外。
对于我所看到的,这是因为“Microsoft.VsSDK.targets”位于“C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ Microsoft \ VisualStudio \ v15.0 \ VSSDK \ Microsoft.VsSDK.targets“有一个新的排除规则”“
我们的解决方案需要NewtonSoft,如果我使用VS> = 15.5安装vsix,关于newtonsoft不在包中,它无法在%appdata%\ microsoft \ visualstudio \ extensions中请求此程序集。
我们做过的测试: 我从VsSDK.targets中删除了这个例外,它的工作原理是因为在软件包上插入了newtonsoft。
我已经在清单的Assets上插入了程序集,但是没有插入程序集,因此它失败了。
我们更新了我们的dependendies,以确保我们使用相同的版本,NewtonSoft 9.0.0。
我们如何解决这个问题,考虑到我们不想在构建机器上更改SDK.targets,因为它会在开发者机器中失败。
是否可以在Assets中添加相对路径?如果有,怎么样?因为我已经尝试过并且没有插入newtonsoft。
** 更新 **
版本15.7.4仍有此问题
谢谢
答案 0 :(得分:1)
将Newtonsoft.Json.dll作为链接项包含在扩展名csproj中。
<Content Include="..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll">
<Link>Newtonsoft.Json.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<IncludeInVSIX>true</IncludeInVSIX>
</Content>
然后可以通过VSIX清单编辑器将文件轻松添加为Microsoft.VisualStudio.Assembly
。这将导致在.vsixmanifest文件中定义以下Asset
。
<Asset d:Source="File" Path="Newtonsoft.Json.dll" Type="Microsoft.VisualStudio.Assembly" AssemblyName="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" />
这不是一个完美的解决方案,因为此链接的项目不会随着软件包的升级而变化,您必须自己进行管理。显然,一个完美的解决方案根本不需要这样做,Newtonsoft.Json.dll将像其他任何引用的程序集一样被包含在内。但是,这是我们发现的侵入性最小的解决方案,它使我们能够控制vsix软件包中包含的Newtonsoft.Json.dll的版本,并且也不依赖于C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PrivateAssemblies
中的版本。
答案 1 :(得分:1)
VS行为是为了防止您运送Newtonsoft.Json的副本。这样做的原因是VS会自己提供一个副本(或在某个时间点复制多个副本...),并包括对该版本的绑定重定向。即使您要在VSIX中放置一个,也绝不能加载它。
如果通过某种方式强制VS加载您的Newtonsoft.Json版本,您将有机会打破VS中依赖于VS随附版本的其他功能。
这是在原始问题发布很长时间之后,但是如果您的%LocalAppData%\Microsoft\VisualStudio\15.0_<instanceID>\devenv.exe.config
不包含代码库和Newtonsoft.Json的绑定重定向,我将打开反馈票证以跟进VS团队。< / p>