提问人:Ambrose Leung 提问时间:4/9/2022 最后编辑:Ambrose Leung 更新时间:4/11/2022 访问量:238
使用 Metalama 在 LinqPad 7 C# (.NET Core/5/6) 中记录参数值
Logging Parameter Values in LinqPad 7 C# (.NET Core/5/6) with Metalama
问:
据我了解,代码需要编译(与 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}");
}
}
}
答:
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 中显示结果。
评论