VSIX扩展 - 如何确保VSIX文件中包含引用的dll或程序集?

时间:2017-02-13 10:33:46

标签: visual-studio-2015 vsix

当用户安装我的扩展程序但未安装最新的Visual Studio更新时,该扩展程序无法解析 Microsoft.CodeAnalysis.CSharp.dll ,并带有以下内容消息:

  

无法加载文件或程序集' Microsoft.CodeAnalysis.CSharp,   Version = 1.2.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'要么   其中一个依赖项。系统找不到指定的文件。

我确定扩展确实引用了这个程序集,但确实如此,但是为什么要从VSIX文件中排除这个程序集?

我将VSIX文件重命名为ZIP,查看了内容,但是这个程序集没有发货,即使其他" Microsoft.CodeAnalysis。*。dll"程序集包含在VSIX文件中。

我还确认了" 复制本地"引用上的属性为True。

2 个答案:

答案 0 :(得分:4)

我找到了解决这个问题的方法,我可以看到现在包含在VSIX中的dll,并且用户确认它对他有效。

  1. 在Visual Studio中,打开扩展解决方案
  2. 双击.vsixmanifest文件
  3. 打开“资产”标签
  4. 点击“新建”
  5. 将“类型”设置为“Microsoft.VisualStudio.Assembly”
  6. 将Source设置为“FileSystem上的文件”
  7. 单击“浏览”将路径设置为dll,(不要担心引用不会添加为绝对路径,而是添加为相对路径或仅添加强大的程序集名称)
  8. 您可以将“嵌入此文件夹”留空。
  9. 点击确定
  10. 重建解决方案,文件现在应该在VSIX文件中。
  11. enter image description here

    然后将此行添加到vsixmanifest文件中:

    <Asset Type="Microsoft.VisualStudio.Assembly" d:Source="File" Path="Microsoft.CodeAnalysis.CSharp.dll" AssemblyName="Microsoft.CodeAnalysis.CSharp, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    

答案 1 :(得分:0)

我找到了与Martin类似的解决方法,但是没有要求DLL副本位于项目文件夹中的副作用。 (我仍未弄清楚如何添加缺少的非英语资源程序集。)

步骤0:如果您具有间接依赖关系-vsix依赖于项目B,该项目使用的NuGet程序包C依赖于程序包D,请确保C和D的DLL包含在vsix的bin \ Debug文件夹中。如果不是,为了安全起见,我建议将对程序包C和D的引用添加到vsix项目中。就我而言,VS决定在VSIX中包括一些间接依赖项,例如 System.Numerics.Vectors.dll System.Threading.Tasks.Extensions.dll ,但它决定省略四个间接依赖项: Microsoft.CodeAnalysis.dll Microsoft.CodeAnalysis.CSharp.dll System.Reflection.Metadata.dll System.Collections.Immutable.dll

第1步:重建并找出VSIX中缺少的文件。您可以将.vsix重命名为.zip,以查找其中的内容,然后将其与vsix项目文件夹中bin \ Debug的内容进行比较,以查找丢失的项目。

第2步:将“添加>现有项...”与“添加为链接”一起使用,以将丢失的DLL添加到您的项目中(如果不确定DLL的位置,请在“引用”列表中找到它,在“属性”面板中查看其“路径”属性。)

Step 2a Step 2b

第3步:对每个丢失的DLL重复第2步。

步骤4:选择新的DLL,然后在“属性”面板中,设置“在VSIX中包含”标志。

Step 4

在我的(老式)csproj中,我最终得到一个ItemGroup,如下所示:

  <ItemGroup>
    <Content Include="..\packages\Microsoft.CodeAnalysis.Common.3.6.0\lib\netstandard2.0\Microsoft.CodeAnalysis.dll">
      <Link>Microsoft.CodeAnalysis.dll</Link>
      <IncludeInVSIX>true</IncludeInVSIX>
    </Content>
    <Content Include="..\packages\Microsoft.CodeAnalysis.CSharp.3.6.0\lib\netstandard2.0\Microsoft.CodeAnalysis.CSharp.dll">
      <Link>Microsoft.CodeAnalysis.CSharp.dll</Link>
      <IncludeInVSIX>true</IncludeInVSIX>
    </Content>
    <Content Include="..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll">
      <Link>System.Collections.Immutable.dll</Link>
      <IncludeInVSIX>true</IncludeInVSIX>
    </Content>
    <Content Include="..\packages\System.Reflection.Metadata.1.6.0\lib\netstandard2.0\System.Reflection.Metadata.dll">
      <Link>System.Reflection.Metadata.dll</Link>
      <IncludeInVSIX>true</IncludeInVSIX>
    </Content>
  </ItemGroup>

第5步:重建并验证文件现在是否包含在vsix中。您不需要将文件添加到“资产”列表中。然后在Visual Studio中对其进行测试。祝你好运!

PS 。我已经想到,也许VSIX不包含这些文件的原因是因为VS知道Visual Studio已经安装了这些文件。但是这种解释并不令人满意,因为例如,Visual Studio具有 System.Memory.dll System.Numerics.Vectors.dll 的副本,但是VS仍然选择包括这些DLL。在我的VSIX中。

无论如何,我的扩展程序无法加载Visual Studio 2019的文件副本。我注意到我的Microsoft.CodeAnalysis.dll版本为“ 3.6.0-4.20269.4 + ...”,而 C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Community \ Common7中的副本\ IDE \ CommonExtensions \ Microsoft \ ManagedLanguages \ VBCSharp \ LanguageServices 是“ 3.5.0-beta4-20153-05 + ...”(假设这很重要-我不知道,还有5个其他副本在程序文件中)。通过将我的VSIX降级以使用早于 3.5.0-beta4的版本(假设Beta版本不在NuGet上),也许我的扩展程序将能够使用Visual Studio的副本。但这是另一天的测试,即使它可以工作,如果我想同时针对Visual Studio 2017和Visual Studio 2019,我怀疑如果我不包括我所有的DLL,我是否可以同时针对同一个vsix的两个版本进行测试vsix中需要。