当用户安装我的扩展程序但未安装最新的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。
答案 0 :(得分:4)
我找到了解决这个问题的方法,我可以看到现在包含在VSIX中的dll,并且用户确认它对他有效。
然后将此行添加到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的位置,请在“引用”列表中找到它,在“属性”面板中查看其“路径”属性。)
第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中对其进行测试。祝你好运!
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中需要。