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

Visual studio 2015 VSIX扩展-如何确保VSIX文件中包含引用的dll或程序集?,visual-studio-2015,vsix,Visual Studio 2015,Vsix,当用户安装my extension但未安装最新的Visual Studio更新时,扩展无法解析Microsoft.CodeAnalysis.CSharp.dll,并显示以下消息: 无法加载文件或程序集Microsoft.CodeAnalysis.CSharp, 版本=1.2.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35'或 它的一个依赖项。系统找不到指定的文件 我确保扩展确实引用了这个程序集,它确实引用了,但是为什么要从VSIX文件中排除这个程序集呢 我将

当用户安装my extension但未安装最新的Visual Studio更新时,扩展无法解析Microsoft.CodeAnalysis.CSharp.dll,并显示以下消息:

无法加载文件或程序集Microsoft.CodeAnalysis.CSharp, 版本=1.2.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35'或 它的一个依赖项。系统找不到指定的文件

我确保扩展确实引用了这个程序集,它确实引用了,但是为什么要从VSIX文件中排除这个程序集呢

我将VSIX文件重命名为ZIP,查看了其内容,但此程序集未发布,即使VSIX文件中包含其他“Microsoft.CodeAnalysis.*.dll”程序集


我还确认了引用上的“复制本地””属性是正确的。

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

  • 在Visual Studio中,当扩展解决方案打开时
  • 双击.vsixmanifest文件
  • 打开“资产”选项卡
  • 单击“新建”
  • 将类型设置为“Microsoft.VisualStudio.Assembly”
  • 将源设置为“文件系统上的文件”
  • 单击“浏览”以设置dll的路径(不要担心引用不是作为绝对路径添加的,而是作为相对路径添加的,或者只是一个强程序集名称)
  • 您可以将“嵌入此文件夹”留空
  • 单击“确定”
  • 重新生成解决方案,该文件现在应该位于VSIX文件中
  • 该行随后添加到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" />
    

    我发现了一个类似于Martin的解决方案,但没有要求DLL副本位于项目文件夹中的副作用。(我还没有找到如何添加缺少的非英语资源程序集。)

    步骤0:如果您有间接依赖项-vsix依赖于使用NuGet包C(依赖于包D)的项目B-请确保C和D的DLL包含在vsix的bin\Debug文件夹中。如果不是,为了安全起见,我建议在vsix项目中添加对包C和D的引用。在我的例子中,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的位置,请在引用列表中找到它,并在“属性”面板中查看其路径属性。)

    步骤3:对每个缺少的DLL重复步骤2

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

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

    
    Microsoft.CodeAnalysis.dll
    真的
    Microsoft.CodeAnalysis.CSharp.dll
    真的
    System.Collections.Immutable.dll
    真的
    System.Reflection.Metadata.dll
    真的
    
    步骤5:重建并验证文件现在是否包含在vsix中。您不需要将文件添加到资产列表中。然后在VisualStudio中测试它。祝你好运

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


    在任何情况下,我的扩展都无法加载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的版本(假设测试版不在NuGet上),也许我的扩展可以使用Visual Studio的副本。但这是另一天的测试,即使它起作用,如果我想同时针对Visual Studio 2017和Visual Studio 2019,如果我没有在vsix中包含我需要的所有DLL,我怀疑我是否可以同时针对这两个版本。这是无论你做什么,有些程序集都不会进入vsix。您好@HugoQuintelaRibeiro,请查看我在下面找到的解决方案。希望它也能帮助您。这对我来说很有用,但应该注意的是,许多DLL,尤其是Microsoft DLL,都附带了许多独立的外语资源程序集。如果没有这些程序集,这可能必须安排在正确的文件夹中,文本将始终为英文。此外,VS会奇怪地将新的“资产”DLL复制到项目文件夹的根目录中;不确定这是否可以防止。相关:遗憾的是,从项目中删除额外副本并手动更改vsix以添加路径(例如更改
    Path=“Microsoft.CodeAnalysis.dll”
    to Path=“..\packages\Microsoft.CodeAnalysis.Common.3.6.0\lib\netstandard2.0\Microsoft.CodeAnalysis.dll”不起作用-一旦删除额外副本,该dll将不再包含在vsix中。