使用 Metalama 在 LinqPad 7 C# (.NET Core/5/6) 中记录参数值

Logging Parameter Values in LinqPad 7 C# (.NET Core/5/6) with Metalama

提问人:Ambrose Leung 提问时间:4/9/2022 最后编辑:Ambrose Leung 更新时间:4/11/2022 访问量:238

问:

据我了解,代码需要编译(与 VS 编译代码的方式相同)才能工作。但是 LinqPad 使用 Roslyn 编译代码。OverrideMethodAspect

关于如何开始使用 LinqPad 中定义的方法的任何想法?OverrideMethodAspect

如果有人感兴趣,这里是工作代码(用于 VS)。(只需从 nuget 添加包 - 确保选中“包含预发布”)Metalama.Framework

using Metalama.Framework.Aspects;

public class Program
{
    public static void Main(string[] args)
    {
        TestMethod("foo");
    }

    [SimpleLog]
    public static void TestMethod(string x)
    {
        Console.WriteLine("Hello, " + x);
    }
}


public class SimpleLogAttribute : OverrideMethodAspect
{
    public override dynamic OverrideMethod()
    {
        Console.WriteLine($"Entering Method - first arg value is: {meta.Target.Method.Parameters.First().Value}");

        try
        {
            return meta.Proceed();
        }
        finally
        {
            Console.WriteLine($"Leaving {meta.Target.Method}");
        }
    }
}
Linqpad 后夏普 Metalama

评论


答:

2赞 Joe Albahari 4/11/2022 #1

据我所知,Metalama 在 MSBuild 级别挂钩,将 Roslyn 程序集替换为其自己的实现方面重写的版本。LINQPad 不使用 MSBuild,因此它需要了解并使用 Metalama 的 Roslyn 版本,并显式使用它。如果 Metalama 的 Roslyn 程序集与标准 Roslyn 程序集二进制兼容,这可能是可行的,尽管在 .NET Core/5/6 中处理程序集解析、隔离和卸载时可能仍然存在(可能棘手的)问题。到目前为止,这些问题阻碍了 LINQPad 7 中使用源生成器。

评论

0赞 Gael Fraiteur 5/9/2022
这是正确的。由于 Metalama 附带了 LinqPad 驱动程序,但该驱动程序不会取代 LinqPad 编译器逻辑,因此可能会造成一些混淆。Metalama 的 LinqPad 驱动程序仅允许您反思 C# 项目并在 LinqPad 中显示结果。