2017-04-09 79 views
1

我有一個Visual Studio擴展(VSIX),可以在VS2015和VS2017中使用。該VSIX依靠Microsoft.VisualStudio.Data.Framework,由於我在VS2017開發我在我的csproj以下行:在VSIX中引用具有多個VS版本的程序集版本

<Reference 
    Include="Microsoft.VisualStudio.Data.Framework, Version=15.0.0.0, 
    Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
/> 

但是,當用戶試圖安裝我的VS2015擴展,他們理解得到一個例外:

無法加載文件或程序集「Microsoft.VisualStudio.Data.Framework,版本= 15.0.0.0,文化=中性公鑰= b03f5f7f11d50a3a」或它的一個依賴。

我該如何在一個VSIX中引用Microsoft.VisualStudio.Data.Framework這個目標是VS版本?如果我將版本從15更改爲14,則由於未安裝VS2015(我也懷疑安裝在VS2017中的用戶會遇到問題),因此我無法再在我的機器上構建。

+0

有沒有簡單的方法來做到這一點。可以針對最低支持的版本進行構建,並信任devenv.exe.config中的bindingRedirects加載正確的版本,或爲每個版本的Visual Studio構建單獨的vsix。 – jessehouwing

+0

你的意思是VS2017自帶了devenv.exe.config中的重定向,使它自動加載標準DLL的以前版本?如果是這樣,這是一個非常令人滿意的解決方案...... –

+0

是的,它確實如此。儘管不是所有的程序集*都是向後兼容的。所以這需要廣泛的測試。 – jessehouwing

回答

1

VS 2017的文件夾中Common7 \ IDE的devenv.exe.config文件有此綁定從14.0.0.0版本Microsoft.VisualStudio.Data.Framework重定向到15.0.0.0:

<dependentAssembly> 
    <assemblyIdentity name="Microsoft.VisualStudio.Data.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
    <bindingRedirect oldVersion="8.0.0.0-14.0.0.0" newVersion="15.0.0.0"/> 
</dependentAssembly> 

所以你項目需要引用版本14.0.0.0。來自哪裏?兩種方法:

  1. 使用NuGet package to get Microsoft.VisualStudio.Data.Framework。 (確保引用版本14.0.x,而不是版本15.x)

  2. 創建一個文件夾,將其放入Microsoft.VisualStudio.Data.Framework 14.0.x版本中,並將該文件夾與您的項目一起添加到源代碼管理中。

+0

我不明白。他應該在VS 2015中使用14.0.0.0,在VS 2017中使用15.0.0.0。由於bindingRedirect,VSIX項目不會總是使用15.0.0.0嗎? – sotn

+0

VSIX是一個包Dll的部署機制。 Dll項目包必須參考14.0.0.0版本才能與VS 2015和VS 2017一起使用.VSIX將獨立部署該包到VS 2015和VS 2017.VS 2015將使用14.0.0.0。 VS 2017會將14.0.0.0重定向到15.0.0.0 –

相關問題