据我所知,代码需要编译(与编译代码的方式相同),OverrideMethodAspect才能工作。但是LinqPad用Roslyn编译了代码。
对于如何让OverrideMethodAspect处理在LinqPad中定义的方法,有什么想法吗?
如果有人感兴趣的话,这是用于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}");
}
}
}发布于 2022-04-11 02:39:55
据我所见,Metalama在MSBuild级别挂钩,用自己实现方面重写的版本替换Roslyn程序集。LINQPad不使用MSBuild,所以它需要知道并使用Metalama的Roslyn版本,并明确使用它。如果Metalama的Roslyn程序集与标准的Roslyn程序集是二进制兼容的,那么这可能是可行的,尽管在处理.NET Core/5/6中的程序集解析、隔离和卸载时仍然存在(可能是棘手的)问题。到目前为止,这些问题已经阻止了在LINQPad 7中使用源生成器。
https://stackoverflow.com/questions/71808745
复制相似问题