gpt4 book ai didi

c# - 编译前如何修改代码?

转载 作者:IT王子 更新时间:2023-10-29 03:52:01 28 4
gpt4 key购买 nike

使用 Roslyn,我想在实际编译之前修改我的 C# 代码。现在,我只需要这样的东西:

[MyAnotatedMethod]
public void MyMethod()
{
// method-body
}

根据注解,我想在方法的开头和结尾注入(inject)一些代码。

我知道 PostSharp,但这不是我想要的。

这可能与罗斯林有关吗?如果是,您能举个例子吗?

最佳答案

这是一种快速而肮脏的方式来做你想做的事。它基于上述评论之一,指向 SebbyLive .这只是一个概念证明,我不会尝试在生产中使用它。

基本思想是更改要修改的项目的编译器。这个更改后的编译器将进行代码注入(inject)。因此,您需要编写一个新的编译器 (AopCompiler.exe) 并将其设置为项目中的构建工具。

将AopCompiler.exe设置为构建工具很简单,在你的项目文件中,你需要添加以下两行:

<CscToolPath>$(SolutionDir)AopCompiler\bin\Debug</CscToolPath>
<CscToolExe>AopCompiler.exe</CscToolExe>

AopCompiler 应该是一个简单的控制台应用程序。这也在进行代码修改和编译。如果不想修改源码,直接build的话,最简单的方法就是自己调用csc.exe:

static void Main(string[] args)
{
var p = Process.Start(@"C:\Program Files (x86)\MSBuild\14.0\Bin\csc.exe",
string.Join(" ", args));
p.WaitForExit();
}

因此,如果您到目前为止进行了设置,您将拥有一个正常的构建过程,没有方面编织。

此时,如果您查看 args 中的内容,您会看到有一个指向 .RSP 文件的文件路径,其中包含 csc 的所有命令行参数。可执行程序。当然,这些参数也包含所有 .CS 文件名。所以你可以解析这个 .RSP 文件并找到所有的 .CS 文件,它们是编译的一部分。

有了 C# 文件,就可以用 Roslyn 完成重写。 CSharpSyntaxRewriter 有很多教程,例如here , 和 here .您需要编写自定义 CSharpSyntaxRewriter,它检查给定的属性,然后将日志记录添加到找到的方法的开头。在每个方法的末尾添加日志记录有点棘手,因为可能有多个退出点。要找到这些,您可以使用控制流分析。内置的 Roslyn 控制流分析可以准确地为您提供所需的信息,ExitPoints属性保存区域内跳转到区域外位置的语句集。

要获取语义模型(然后进行 CFG 分析),您可以这样做:

public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
{
var semanticModel = _compilation.GetSemanticModel(node.SyntaxTree);
// semanticModel.AnalyzeControlFlow(node.Block)
return node;
}

最后,要处理每个输入文件,您的 AopCompiler,您只需简单地调用重写器在树的根部的 Visit 方法。这将生成修改后的树,您可以将其写入文件。 (您可以修改原始文件,也可以将结果写入新文件,并相应地更改.RSP 文件。)

很抱歉没有提供完整的工作解决方案,但我希望这足以让您入门。

关于c# - 编译前如何修改代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33316049/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com