C# Roslyn INamedTypeSymbol.GetMembers()在Roslyn API上抛出未找到异常的方法

C# Roslyn INamedTypeSymbol.GetMembers()在Roslyn API上抛出未找到异常的方法,c#,roslyn,C#,Roslyn,我试图使用Roslyn导航到方法声明。我有名称空间名称、类名和方法名。在下面的代码示例中,我能够填充classReference变量。但只要调用classReference.GetMembers(),我就会得到方法NotFoundException。虽然当我在中间窗口(Visual Studio调试模式)中执行classReference.GetMembers()时,它给出了正确的方法名 public async void NavigateToMethod(string className, s

我试图使用Roslyn导航到方法声明。我有名称空间名称、类名和方法名。在下面的代码示例中,我能够填充classReference变量。但只要调用classReference.GetMembers(),我就会得到方法NotFoundException。虽然当我在中间窗口(Visual Studio调试模式)中执行classReference.GetMembers()时,它给出了正确的方法名

public async void NavigateToMethod(string className, string methodName)
    {
        Microsoft.CodeAnalysis.Solution sol = Workspace.CurrentSolution;
        foreach (Microsoft.CodeAnalysis.Project project in sol.Projects)
        {
            bool found = false;

            Compilation compilation = await project.GetCompilationAsync();
            INamedTypeSymbol classReference = compilation.GetTypeByMetadataName(className);
            List<ISymbol> l = classReference.GetMembers().ToList<ISymbol>();
            Debug.WriteLine(l);



            foreach (ISymbol isymbol in classReference.GetMembers(methodName))
            {
                IMethodSymbol methodSymbol = isymbol as IMethodSymbol;
                CancellationTokenSource cts = new CancellationTokenSource();
                if (Workspace.TryGoToDefinition(methodSymbol, project, cts.Token))
                {
                    found = true;
                    break;
                }
            }
            if (found)
            {
                break;
            }
        }
    }
public async void NavigateToMethod(string类名称,string方法名称)
{
Microsoft.CodeAnalysis.Solution sol=Workspace.CurrentSolution;
foreach(sol.Projects中的Microsoft.CodeAnalysis.Project项目)
{
bool-found=false;
Compilation Compilation=await project.GetCompilationAsync();
INamedTypeSymbol classReference=compilation.GetTypeByMetadataName(className);
List l=classReference.GetMembers().ToList();
调试写入线(l);
foreach(classReference.GetMembers(methodName)中的ISymbol-ISymbol)
{
IMethodSymbol methodSymbol=isymbol作为IMethodSymbol;
CancellationTokenSource cts=新的CancellationTokenSource();
if(Workspace.TryGoToDefinition(methodSymbol、project、cts.Token))
{
发现=真;
打破
}
}
如果(找到)
{
打破
}
}
}
例外情况 System.MissingMethodException

HResult=0x8013153

Message=未找到方法:“System.Collections.Immutable.ImmutableArray`1 Microsoft.CodeAnalysis.INamespaceOrTypeSymbol.GetMembers()”

这令人困惑。当我查看Microsoft.CodeAnalysis.InNamespaceorTypeSymbol文档时,GetMembers()方法已存在(public),并且我正在引用具有此方法的程序集,该方法在运行时也可用

请注意classReference.GetMembers(methodName)只在中间窗口中工作,不确定发生了什么

package.config

<packages>
  <package id="Microsoft.CodeAnalysis" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.CodeAnalysis.Analyzers" version="2.6.0" targetFramework="net461" developmentDependency="true" />
  <package id="Microsoft.CodeAnalysis.Common" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.CodeAnalysis.CSharp" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.CodeAnalysis.CSharp.Workspaces" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.CodeAnalysis.VisualBasic" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.CodeAnalysis.VisualBasic.Workspaces" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.CodeAnalysis.Workspaces.Common" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.Composition" version="1.0.31" targetFramework="net461" />
  <package id="Microsoft.Net.Compilers" version="2.7.0" targetFramework="net461" developmentDependency="true" />
  <package id="Microsoft.VisualStudio.CoreUtility" version="15.6.27740" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.ImageCatalog" version="15.6.27413" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Imaging" version="15.6.27413" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.LanguageServices" version="2.7.0" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.OLE.Interop" version="7.10.6071" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.SDK.EmbedInteropTypes" version="15.0.16" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.15.0" version="15.6.27413" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Framework" version="15.6.27413" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop" version="7.10.6072" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop.10.0" version="10.0.30320" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop.11.0" version="11.0.61031" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop.12.0" version="12.0.30111" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime" version="15.0.26929" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop.15.6.DesignTime" version="15.6.27413" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop.8.0" version="8.0.50728" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Shell.Interop.9.0" version="9.0.30730" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Text.Data" version="15.6.27413" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.TextManager.Interop" version="7.10.6071" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.TextManager.Interop.8.0" version="8.0.50728" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Threading" version="15.6.46" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Threading.Analyzers" version="15.6.46" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Utilities" version="15.6.27413" targetFramework="net461" />
  <package id="Microsoft.VisualStudio.Validation" version="15.3.32" targetFramework="net461" />
  <package id="Microsoft.VSSDK.BuildTools" version="15.6.170" targetFramework="net461" developmentDependency="true" />
  <package id="Newtonsoft.Json" version="6.0.6" targetFramework="net461" />
  <package id="StreamJsonRpc" version="1.2.8" targetFramework="net461" />
  <package id="System.AppContext" version="4.3.0" targetFramework="net46" />
  <package id="System.Collections" version="4.3.0" targetFramework="net46" />
  <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net46" />
  <package id="System.Collections.Immutable" version="1.5.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Composition" version="1.2.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Composition.AttributedModel" version="1.2.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Composition.Convention" version="1.2.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Composition.Hosting" version="1.2.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Composition.Runtime" version="1.2.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Composition.TypedParts" version="1.2.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Console" version="4.3.0" targetFramework="net46" />
  <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net46" />
  <package id="System.Diagnostics.FileVersionInfo" version="4.3.0" targetFramework="net46" />
  <package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="net46" />
  <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net46" />
  <package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="net46" />
  <package id="System.Globalization" version="4.3.0" targetFramework="net46" />
  <package id="System.IO.Compression" version="4.3.0" targetFramework="net46" />
  <package id="System.IO.FileSystem" version="4.3.0" targetFramework="net46" />
  <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net46" />
  <package id="System.Linq" version="4.3.0" targetFramework="net46" />
  <package id="System.Linq.Expressions" version="4.3.0" targetFramework="net46" />
  <package id="System.Reflection" version="4.3.0" targetFramework="net46" />
  <package id="System.Reflection.Metadata" version="1.6.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net461" />
  <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net46" />
  <package id="System.Runtime" version="4.3.0" targetFramework="net46" />
  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net46" />
  <package id="System.Runtime.Handles" version="4.3.0" targetFramework="net461" />
  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net46" />
  <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net46" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net461" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net46" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net46" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net461" />
  <package id="System.Text.Encoding" version="4.3.0" targetFramework="net46" />
  <package id="System.Text.Encoding.CodePages" version="4.5.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net46" />
  <package id="System.Threading" version="4.3.0" targetFramework="net46" />
  <package id="System.Threading.Tasks" version="4.3.0" targetFramework="net46" />
  <package id="System.Threading.Tasks.Parallel" version="4.3.0" targetFramework="net46" />
  <package id="System.Threading.Thread" version="4.3.0" targetFramework="net46" />
  <package id="System.ValueTuple" version="4.5.0-preview1-26216-02" targetFramework="net461" />
  <package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net461" />
  <package id="System.Xml.XDocument" version="4.3.0" targetFramework="net46" />
  <package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="net46" />
  <package id="System.Xml.XPath" version="4.3.0" targetFramework="net46" />
  <package id="System.Xml.XPath.XDocument" version="4.3.0" targetFramework="net46" />
</packages>

问题是System.Collections.Immutable版本,我使用的是1.5.0-preview,这是因为我在nuget package manager UI中单击了“全部更新”

<package id="System.Collections.Immutable" version="1.5.0-preview1-26216-02" targetFramework="net461" />


当我将System.Collections.Immutable降级到1.3.1版时,异常就消失了

如果混合使用Roslyn版本,则会发生这种情况。我使用的是2.7.0版-添加的packages.config文件内容运行时加载的是哪个版本?(调试,模块)在调试中加载版本2.7.0,“devenv.exe”(CLR v4.0.30319:DefaultDomain):加载“C:\Program Files(x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\ManagedLanguages\VBCSharp\LanguageServices\Microsoft.CodeAnalysis.dll”。已跳过加载符号。模块已优化,并且调试器选项“仅我的代码”已启用。加载的模块