1

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

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”或其某个依赖项不能为f ound。系统找不到该文件。

堆栈跟踪:在MyAssembly.MyToolWindow.ReloadSolutionInformation() 在MyAssembly.MyToolWindow..ctor() 在MyAssembly.MyToolWindowPane..ctor()

文件名:Microsoft.VisualStudio.LanguageServices,版本= 2.3。 0.0,文化=中性公钥= 31bf3856ad364e35

此外,我注意到生成后以下警告:

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

随着生成输出详细设置为诊断,我只发现上述警告没有进一步的信息。检查构建输出目录,我看到包含所有引用的DLL,但除了Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.dll之外,所有Microsoft.VisualStudio.* DLL在VSIX中都缺失。据我了解互操作程序集,我认为它们是由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

有没有人在这里看到问题?提前致谢。

+0

,似乎VS扩展找不到一些dll文件,我不知道是什么原因导致的问题。请通过OneDrive分享一个简单的演示。 –

+0

您也可以使用fusionlog(https://docs.microsoft.com/en-us/dotnet/framework/tools/fuslogvw-exe-assembly-binding-log-viewer)来检查扩展程序在哪里查找这些程序集。 – utkarsh

+0

@ ColeWu-MSFT:我会尽快分享一个演示。 –

回答

1

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

对于社区2017年,他们可以在

C下找到:\程序文件(x86)\微软的Visual 工作室\ 2017年\社区\ Common7 \ IDE \ CommonExtensions \微软\ 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

加入<ForceIncludeInVSIX>true</ForceIncludeInVSIX>到.csproj的文件新版本Microsoft.VisualStudio.LanguageServices您可以在VSIX的:

<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

对于''+1。不幸的是,这只是一个肮脏的解决方法,我得到了同样的例外。必须有2个库参与,所以有一个'VisualStudioWorkspace'派生的'RoslynVisualStudioWorkspace' - 我怀疑前者来自Visual Studio,后者来自嵌入式程序集。对于这些类而言,这导致CLR未能从相同的继承层次结构中进行匹配。最后,它不起作用,甚至在尝试解决这个问题时似乎失去了方向,因此我无法接受这个答案。 –

+0

我想将此添加为评论。但是stackoverflow并没有给我带来低声誉 –

+0

是的,我可以记得前一段时间和我一样的情况。 –

0

好的,我明白了。

什么都不做,只是清理vsix项目的bin文件夹。根据您的描述,其余将正常工作

enter image description here

+0

我看到我没有提到它,但这通常是我做的第二件事 - 创建解决方案目录的备份之后。所以,恭喜它为你工作,但它并没有解决我的问题。不管怎么说,还是要谢谢你。 –