【问题标题】:Reference problems in Visual Studio extensionVisual Studio 扩展中的参考问题
【发布时间】:2017-07-25 22:25:09
【问题描述】:

我是 Visual Studio 扩展的新手,我尝试了一些来自 GitHub 的示例以及来自这里的一些有用的建议,并取得了一些成功。我正在尝试创建一个 ToolWindow 来处理当前打开的解决方案的结构,从技术上讲,Microsoft.VisualStudio.LanguageServices 命名空间没有问题。只要我不使用该命名空间中的任何内容,ToolWindow 本身就可以工作 - 特别是以下调用的函数会在我的窗口的构造函数中初始化解决方案信息:

private void ReloadSolutionInformation()
{
    var componentModel = (IComponentModel)SmartOptionsEditorPackage.GetGlobalService(typeof(SComponentModel));
    VisualStudioWorkspace workspace = componentModel.GetService<VisualStudioWorkspace>();
    Solution solution = workspace.CurrentSolution;

    this.Solutions.Clear(); // some collection of SolutionNode instances

    // create and add custom tree node with solution information
    var solutionNode = new SolutionNode(solution.FilePath);
    this.Solutions.Add(solutionNode);

    // recurse through projects etc.
    PopulateSolutionWithProjects(solutionNode, solution);
}

当我在 Visual Studio 2017 的实验实例中运行扩展以对其进行调试时,在调用上述方法的构造函数中出现以下异常(原文是德语,我的翻译可能不是 100% 准确):

找不到文件或程序集“Microsoft.VisualStudio.LanguageServices, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或其依赖项之一。系统找不到文件。

StackTrace:在 MyAssembly.MyToolWindow.ReloadSolutionInformation() 在 MyAssembly.MyToolWindow..ctor() 在 MyAssembly.MyToolWindowPane..ctor()

文件名:Microsoft.VisualStudio.LanguageServices,版本=2.3.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35

此外,我在构建后注意到以下警告:

CS1762:创建了对嵌入式互操作程序集 'Microsoft.VisualStudio.Shell.Interop.10.0, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 的引用,因为间接引用了由程序集创建的程序集Microsoft.VisualStudio.LanguageServices,版本=2.3.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35'。考虑更改任一程序集上的“嵌入互操作类型”属性。

将构建输出详细程度设置为诊断时,我只发现上述警告而没有进一步的信息。检查构建输出目录,我看到所有引用的 DLL 都包含在内,但 VSIX 中缺少所有 Microsoft.VisualStudio.* DLL,Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.dll 除外。据我了解互操作程序集,我认为它们是由 VisualStudio 提供的,所以我不必嵌入它们,不是吗?

每个引用的引用属性 Embed Interop Types 设置为 false。我试图根据我找到的一些建议来改变它,但这没有用。我的目标是 .Net 4.6.2。

在经历了太多令人沮丧的反复试验后,我仍然不知道如何解决这个问题。这包括重新安装 NuGet 包、重新启动所有内容、重置实验实例以及逐步删除和重新添加引用作为本地 DLL 和 NuGetPackage。在以前的编辑中,我发布了一个缩短的项目文件内容,由于输入字符限制,我现在不得不将其删除。相反,这里是 fusionlog 的输出:

=== Zustandsinformationen vor Bindung ===
LOG: DisplayName = Microsoft.VisualStudio.LanguageServices, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/
LOG: Ursprünglicher PrivatePath = NULL
Aufruf von Assembly : MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: Diese Bindung startet im LoadFrom-Load-Kontext.
WRN: Das systemeigene Image wird nicht im LoadFrom-Kontext durchsucht. Das systemeigene Image wird nur im Standard-Load-Kontext durchsucht, z. B. Assembly.Load().
LOG: Die Anwendungskonfigurationsdatei wird verwendet: C:\Users\me\AppData\Local\Microsoft\VisualStudio\15.0_15d7a44dExp\devenv.exe.config
LOG: Die Hostkonfigurationsdatei wird verwendet: 
LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config wird verwendet.
LOG: Verweis nach der Richtlinie: Microsoft.VisualStudio.LanguageServices, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PublicAssemblies/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PublicAssemblies/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/Debugger/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/Debugger/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/DiagnosticsHub/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/DiagnosticsHub/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/x86/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/x86/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PublicAssemblies/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PublicAssemblies/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/Debugger/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/Debugger/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/DiagnosticsHub/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/CommonExtensions/Platform/DiagnosticsHub/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/x86/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/IDE/PrivateAssemblies/DataCollectors/x86/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/USERS/ME/APPDATA/LOCAL/MICROSOFT/VISUALSTUDIO/15.0_15D7A44DEXP/EXTENSIONS/AUTHOR/MY ASSEMBLY/1.0/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/USERS/ME/APPDATA/LOCAL/MICROSOFT/VISUALSTUDIO/15.0_15D7A44DEXP/EXTENSIONS/AUTHOR/MY ASSEMBLY/1.0/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.DLL.
LOG: Download von neuem URL file:///C:/USERS/ME/APPDATA/LOCAL/MICROSOFT/VISUALSTUDIO/15.0_15D7A44DEXP/EXTENSIONS/AUTHOR/MY ASSEMBLY/1.0/Microsoft.VisualStudio.LanguageServices.EXE.
LOG: Download von neuem URL file:///C:/USERS/ME/APPDATA/LOCAL/MICROSOFT/VISUALSTUDIO/15.0_15D7A44DEXP/EXTENSIONS/AUTHOR/MY ASSEMBLY/1.0/Microsoft.VisualStudio.LanguageServices/Microsoft.VisualStudio.LanguageServices.EXE.

您可以在this ZIP file 中找到一个最小的解决方案示例。在这里,我用一个新的 VSIX 项目创建了一个新的解决方案,通过向导添加了一个 ToolWindow,添加了我的重要代码,解决了丢失的引用,开始调试并收到了相同的旧 FileNotFoundException

有人看到这里的问题吗?提前致谢。

【问题讨论】:

  • 根据您的描述,似乎 vs-extension 找不到某些 dll 文件,我不确定是什么原因造成的。请通过 OneDrive 分享一个简单的演示。
  • 您还可以使用 fusionlog (docs.microsoft.com/en-us/dotnet/framework/tools/…) 检查扩展程序在哪里寻找这些程序集。
  • @ColeWu-MSFT:我会尽快分享一个演示。
  • @utkarsh:融合日志没有告诉我太多,我会发布输出。
  • @ColeWu-MSFT:我将此链接添加到最后一段中的最小解决方案示例:1drv.ms/u/s!AqzjK9Mbz6Dpdg2-n5vGUNo6a5k

标签: c# visual-studio-2017 visual-studio-extensions vsix assembly-references


【解决方案1】:

您必须使用 Visual Studio 使用的库版本或更低版本。

对于 Community 2017,可以在

中找到它们

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\ManagedLanguages\VBCSharp\LanguageServices

现在在 Visual Studio 2017 版本 15.2
Microsoft.CodeAnalysis.Workspaces.dll、Microsoft.VisualStudio.LanguageServices.dll、Microsoft.CodeAnalysis.EditorFeatures.Text 的版本为 2.2.0。

所以在 NuGet 中安装或更新到 2.2.0 版,无需将它们包含到 vsix

您可以通过将&lt;ForceIncludeInVSIX&gt;true&lt;/ForceIncludeInVSIX&gt; 添加到 .csproj 文件中来包含在 VSIX 中的较新版本的 Microsoft.VisualStudio.LanguageServices:

<Reference Include="Microsoft.VisualStudio.LanguageServices, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> <HintPath>..\packages\Microsoft.VisualStudio.LanguageServices.2.3.1\lib\net46\Microsoft.VisualStudio.LanguageServices.dll</HintPath> <ForceIncludeInVSIX>true</ForceIncludeInVSIX> </Reference>

但是我们会得到其他错误。

System.InvalidCastException:“无法将类型为“Microsoft.VisualStudio.LanguageServices.RoslynVisualStudioWorkspace”的对象转换为类型“Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace”

Visual Studio 2017 版本 15.3 使用 2.3.2 版本。您的扩展使用较低版本 2.2.0 并且可以在那里工作。如果将 NuGet 中的组件更新到 2.3.2,则扩展将在 15.3 中有效,而在 15.2 中无效

所以现在使用 2.2.0 版本。

【讨论】:

  • +1 表示&lt;ForceIncludeInVSIX&gt;。不幸的是,这只是一个肮脏的解决方法,我得到了同样的例外。必须涉及 2 个库,因此有一个从 VisualStudioWorkspace 派生的 RoslynVisualStudioWorkspace - 我怀疑前者来自 Visual Studio,后者是来自嵌入式程序集的类。对于这些类,这会导致 CLR 无法将其匹配为来自相同的继承层次结构。最后,它不起作用,甚至在试图解决这个问题时似乎迷失了方向,因此我不能按原样接受这个答案。
  • 我想将此添加为评论。但是stackoverflow没有给我因为声誉低
  • 是的,我记得前段时间和我一样的情况。
  • 看来,我找到了决定。尝试将 Microsoft.CodeAnalysis.Workspaces 更新到 2.2.0 版。 VS 使用这个。我没有错误。必须经过测试。 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\ManagedLanguages\VBCSharp\InteractiveComponents 中的 VS dll
  • @OlegZ:还不错。至少我现在可以看到我的树被填充在视图模型中。该视图仍未填充,但几周前我已经在这一点上。您最后的 cmets 对这个特定问题最有帮助,所以如果您更新它,我倾向于接受您的回答。
【解决方案2】:

好的,我明白了。

除了清理 vsix 项目的 bin 文件夹之外什么也不做。其余的都可以正常工作

【讨论】:

  • 我知道我没有提到它,但这通常是我做的第二件事 - 在创建解决方案目录的备份之后。所以,恭喜它对你有用,但它并没有解决我的问题。还是谢谢。
猜你喜欢
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2011-05-17
  • 2013-07-15
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多