问题标签 [microsoft.codeanalysis]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
34 浏览

c# - 在编译 C# 项目时确定所需的程序集

我正在为 C# 项目编写元数据提取器。我没有使用 MSBuildWorkspace,而是使用 CSharpSyntaxTree.ParseText() 和 CSharpCompilation.Create()。

检查编译中的诊断信息,我注意到我缺少一些程序集引用:

_references我在编译中使用的集合在哪里:

并且trees是我正在编译的语法树。

我的问题是:有没有办法从语法树或 .csproj 文件中确定需要哪些参考?我通过解析各种<ProjectReference>节点来为添加到项目文件中的 nuget 包执行此操作。但我不知道如何为其他参考做到这一点。

0 投票
0 回答
114 浏览

c# - 在 Roslyn 中解析程序集引用

我正在为 C# 项目编写元数据提取器。它的工作原理是通过SyntaxTrees从源文件创建,通过CSharpSyntaxTree.ParseText()编译它们CSharpCompilation.Create(),然后分析SemanticModel.

我遇到了一个问题,即没有正确处理各种程序集引用。

我通过解析project.assets.json和提取编译时包引用来生成程序集引用(我的测试项目不包括任何项目引用)。的目标部分project.assets.json如下所示:

结果引用列表如下:

我忽略了两个格式奇怪的 netstandard1.0 ,将它们替换为由 创建的引用MetadataReference.CreateFromFile( Assembly.Load( "netstandard" ).Location ) ),并针对本地 nuget 存储库解析剩余路径,从 dll 创建引用。

这大部分工作正常......但某些事情没有解决。以下是我在编译后收到的诊断消息CSharpCompilation.Create()

CS0103 - 当前上下文中不存在名称“Assembly”

CS0103 - 当前上下文中不存在名称“路径”

CS1069 - 在命名空间“System”中找不到类型名称“ApplicationException”。此类型已转发到程序集 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 考虑添加对该程序集的引用。SymbolExtractor::AnalyzeProject

CS0103 - 当前上下文中不存在名称“环境”

有趣的是,所有这些错误都与我正在尝试编译的项目中的静态类中的一种方法有关。我不确定它是否相关,但这是有问题的代码:

关于解决程序集依赖关系,我缺少什么?我是否还需要包括对运行时所需的程序集的引用?

0 投票
0 回答
41 浏览

c# - 使用 CSharpCompilation 限制可用类型/命名空间

我们的应用程序将用户输入解析和编译为 C# 代码,这引入了一些安全问题。通常,用户将使用数学库中的基本算术运算符和函数创建表达式。但是,也可以编写一个执行任意代码的表达式,只要它返回预期的类型。

前任。new System.Threading.Thread(<malicious code>).ManagedThreadId

我们使用CSharpCompilation该类和静态方法 fromSyntaxFactory来编译表达式。

基本上我需要的是某种方式来限制可以在表达式中使用的类型或方法。我的第一个想法是使用黑名单/白名单方法,但我不熟悉 CodeAnalysis 命名空间,希望有人能指出我正确的方向。

如果有人可以向我解释在没有System.Threading向实例添加引用的情况下上述示例如何成功编译,那也太好了CSharpCompilation

0 投票
1 回答
89 浏览

c# - 使用 Roslyn 分析匿名类型内的可空性

这是我想用 Roslyn 分析的一段代码:

我想找出返回属性的可空性。我知道如何找到 theReturnStatementSyntax和它的SemanticModel.

我的问题是 C# 不会在匿名类型上创建可空性注释。上面的匿名类型是{ First: string, Second: string },没有注释。

我的理解是,对于匿名类型,编译器仅使用基于数据流分析的可空性(如果我错了,请纠正我)。悬停时Second,VS 确实正确指示它string?在此位置可以为空。

使用 Roslyn ( Microsoft.CodeAnalysis),我如何提取返回的First属性不可为空且Second可以为空的信息?

0 投票
1 回答
87 浏览

c# - 代码分析:加载 Linq 程序集

我正在编写一个应用程序,它使用 Roslyn API 来提取有关 C# 源代码文件中定义的符号的信息。它通过在内存中编译源代码然后扫描它来做到这一点。为了完成这项工作,我必须加载源代码引用的程序集和 nuget 包。

效果很好......直到我开始分析一些包含一些简单 Linq 表达式的源代码,如下所示:

该代码的作用的细节并不重要。但是当代码库在内存中编译时,在源代码中包含该行会产生以下诊断错误:

CS1061 - “List”不包含“Aggregate”的定义,并且找不到接受“List”类型的第一个参数的可访问扩展方法“Aggregate”(您是否缺少 using 指令或程序集引用?)

Channels是一个List<>。显然我缺少参考:)。

令我困惑的是,我为所有项目加载了某些默认程序集和包:

同样,我认为这段代码所做的细节并不重要。所有这些调用都成功了,这意味着找到了所有目标程序集并将其加载到编译环境中。

然而,由于找不到 Linq 代码,该 Linq 表达式被拒绝了。

我需要添加另一个特定于 Linq 的程序集吗?

0 投票
1 回答
701 浏览

c# - AssemblyDependencyResolver 无法解析

我正在尝试AssemblyLoadContext使用AssemblyDependencyResolverNet Core 3.1(Visual Studio 2019)下的 C# 中的一个自定义项。

但是,虽然我可以AssemblyDependencyResolver在对象浏览器中看到一个公共密封类,但 IntelliSense 和源代码编辑器都不会承认它存在(我using System.Runtime.Loader在文件中有一个声明,所以它应该被识别)。

我从来没有见过这样的事情。我如何去创建一个实例AssemblyDependencyResolver

0 投票
0 回答
73 浏览

c# - 如何为 roslyn 使用 SyntaxFactory

我正在尝试使用 SyntaxFactory 生成代码但卡在转换一个区域

这个想法是有两个变量 removeExpression 和 getExpression 是 ExpressionSyntax 类型,最后两者都将被用来成为匿名函数的主体。

// 帮助我使用 SyntaxFactory 转换下面的行。

IdentifierName("((Func<dynamic>)(() => { var res = " + getExpression.ToString() + ";" + removeExpression.ToString() + "; return res" + " ; }))(); ");

0 投票
1 回答
146 浏览

.net - 在解决方案和引用的程序集中查找派生接口的符号

我正在尝试做什么(与 Roslyn/Microsoft.CodeAnalysis 合作)

我试图在解决方案以及引用的程序集中查找从特定接口继承的所有接口符号。我的目标是尽可能高效和干净地做到这一点。

在这样做的时候,我手头有以下东西:

  • 罗斯林Solution
  • 如果接口的符号,我想从中找到派生接口。

方法

不工作

  • 起初我试图使用SymbolFinder,但以下方法不起作用:
    • SymbolFinder.FindImplementationsAsync(interfaceSymbol, solution)=> 这种方法不起作用,因为它只返回类,但没有接口。
    • SymbolFinder.FindDerivedClassesAsync(interfaceSymbol, solution)=> 这也只是返回类(正如方法名称已经说明的那样)
    • SymbolFinder.FindReferencesAsync(interfaceSymbol, solution)=> 这只是在当前解决方案中返回引用,而不是在引用的程序集中。

在职的

  • 由于上述尝试并没有带来有用的结果,我最后的手段是手动蛮力方法,我基本上收集所有的IAssemblySymbols,迭代所有类型并检查接口(递归完成,使用 a SymbolVisitor)。

那么,我为什么还要寻找另一种解决方案呢?

  • 我希望内置解决方案在性能方面会更好,因为可能已经缓存了一些东西,或者它也可能使用其他数据结构等,因为这就是场景中的情况SymbolFinder
  • 除此之外:更简单,更稳定,......

我的问题

  • 是否有任何更简单且可能更快的解决方案(类似于SymbolFinder已经提供的解决方案)?
0 投票
1 回答
257 浏览

msbuild - 如何从本地放置的 DLL 添加自定义 roslyn 分析器?

我创建了一个 Roslyn Analyzer 项目,它生成一个 nuget 包和它的 DLL。我想在独立的代码分析项目中使用该 DLL。我怎样才能做到这一点?例如我有以下代码:

我试过以下

但是这里AnalyzerAssemblyLoader显示错误,因为它无法访问其保护级别(类是内部的)。

如果我们能做到这一点,请建议我。

0 投票
1 回答
155 浏览

c# - 如何在内存中编译并使用 Microsoft.CodeAnalysis 获取程序集

在我使用 System.CodeDom.Compiler 之前。它具有允许在内存中编译和返回程序集的选项:

我正在迁移到 .net 核心,并且正在使用 Microsoft.CodeAnalysis 从字符串进行编译。但我在上面找不到“在内存中编译”功能。我的目标是验证代码的语法问题。目前我的代码是: