我找到了一个类似于Martin的解决方法,但是没有副作用,不需要将DLL的副本放在项目文件夹中。(我仍然没有弄清楚如何添加缺失的非英语资源程序集。)
步骤0:如果您有间接依赖关系 - vsix依赖于使用NuGet包C的项目B,该包又依赖于包D - 请确保C和D的DLL包含在vsix的bin \ Debug文件夹中。如果没有,请为vsix项目添加对包C和D的引用以确保安全。在我的情况下,VS决定将一些间接依赖项(例如System.Numerics.Vectors.dll和System.Threading.Tasks.Extensions.dll)包含在VSIX中,但它决定省略四个间接依赖项: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
:
<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中进行测试。祝你好运!
P.S. 我想过,也许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+..."(假设这是重要的版本 - 我不知道,在 Program Files 中还有其他 5 个版本)。通过将我的 VSIX 降级到使用早于 3.5.0-beta4 的版本(假设 beta 版本不在 NuGet 上),也许我的扩展程序将能够使用 Visual Studio 的版本。但那是另一天的测试,即使它有效,如果我想针对 Visual Studio 2017 和 Visual Studio 2019,我怀疑如果我不在 vsix 中包含我需要的所有 DLL,我就不能同时针对两个版本进行目标定位。