.net 是否可以从项目文件而不是DLL获取语义模型?

.net 是否可以从项目文件而不是DLL获取语义模型?,.net,roslyn,roslyn-code-analysis,.net,Roslyn,Roslyn Code Analysis,我正在创建一个代码提取器/内联工具,它将使我更容易共享源代码片段。理想情况下,它将采用我提供的方法,遍历该方法的语法树,在我的其他程序集中查找对方法/类型的引用,并将它们全部提取到单个代码块中。这样,如果我想分享我写的一个引用其他扩展的扩展方法,我不必费力地把它编译成可以复制粘贴到互联网上的东西 这篇文章让我开始: 下面是我到目前为止得到的。我在MyExtensions命名空间中的GeneralUtilities类中有一个名为TrimWhiteSpace()的扩展方法。下面的代码成功地识别了这

我正在创建一个代码提取器/内联工具,它将使我更容易共享源代码片段。理想情况下,它将采用我提供的方法,遍历该方法的语法树,在我的其他程序集中查找对方法/类型的引用,并将它们全部提取到单个代码块中。这样,如果我想分享我写的一个引用其他扩展的扩展方法,我不必费力地把它编译成可以复制粘贴到互联网上的东西

这篇文章让我开始:

下面是我到目前为止得到的。我在
MyExtensions
命名空间中的
GeneralUtilities
类中有一个名为
TrimWhiteSpace()
的扩展方法。下面的代码成功地识别了这个扩展,但我还希望访问该方法的主体,这样我就可以在语法树中查找其他扩展。因为我直接使用DLL,它无法访问主体,所以我需要使用项目生成一个
SemanticModel
。使用项目路径似乎不起作用

public static void SemanticsTest()
{
    var tree = CSharpSyntaxTree.ParseText(@"using MyExtensions;
    namespace TestNamespace
    {
    public static class TestClass
    {
        public static void CallTrimWhiteSpace()
        {
            var x = "" some string  "".TrimWhiteSpace();
        }
    }
    }");

    var root = tree.GetRoot();

    var assemblyPath = MetadataReference.CreateFromFile(typeof(GeneralUtilities).Assembly.Location);

    var compilation = CSharpCompilation.Create("MyCompilation",
        syntaxTrees: new[] { tree }, references: new[] { assemblyPath });

    var model = compilation.GetSemanticModel(tree);

    var expression = root.DescendantNodes().OfType<InvocationExpressionSyntax>().FirstOrDefault();
    var symbol = model.GetSymbolInfo(expression);
}
publicstaticvoid语义测试()
{
var tree=CSharpSyntaxTree.ParseText(@)使用MyExtensions;
命名空间TestNamespace
{
公共静态类TestClass
{
公共静态void CallTrimWhiteSpace()
{
var x=”“some string”“.TrimWhiteSpace();
}
}
}");
var root=tree.GetRoot();
var assemblyPath=MetadataReference.CreateFromFile(typeof(GeneralUtilities.Assembly.Location);
var compilation=csharpcomilation.Create(“MyCompilation”,
syntaxTrees:new[]{tree},引用:new[]{assemblyPath});
var model=compilation.GetSemanticModel(树);
var expression=root.degenantNodes().OfType().FirstOrDefault();
var symbol=model.GetSymbolInfo(表达式);
}

您是否尝试使用工作区加载项目@dropoutcoder我开始涉足工作区,但在看到
MSBuildWorkspace
由于某种原因不可用后,我遇到了麻烦。我只是把我的问题贴在这里,而不是掉进一个充满不确定性的兔子洞里。但是,如果工作空间是我需要走的方向,那么我将深入研究为什么找不到对该类的引用。还有VisualStudioWorkspace和AdHocWorkspace。这三者都有不同的存在理由。无论如何,要使其正常工作,您需要处理很多事情,但我认为这是可行的。首先,您需要加载VisualStudioWorkspace以访问当前的解决方案。如果您计划只从加载的解决方案中的项目中创建/提取源代码,那么在到达无法到达的地方之前,这可能只是一些递归的过程。外部LIB。正如我所说,这是可行的,值得一试。好主意@辍学者,谢谢。我刚刚得到了
MSBuildWorkspace
工作空间,所以现在我将研究其他类型的工作空间。