对于我的Logging Lib我计划开发一些功能。第一个将记录被调用的方法和它的参数。例如
public void DoSomething(int value)
{
try
{
// Exception is thrown
}
catch(Exception ex)
{
this._logger.Error(ex);
}
}
Logger现在应该记录:类xy参数值= 15中的方法DoSomething中的错误。 使用Reflection无法实现,使用StackFrame,我可以获取方法名称和参数名称,但不能获取参数值。 我的想法是在运行时或编译时之后将代码注入此方法。 我尝试使用Mono.Cecil,所以我将Code注入此方法,该方法将参数的名称及其值传递给我的记录器。这是有效的。
第二个想法是在方法中添加一个秒表:
[AnalyzePerformanceOfMethod]
public int DoSomething(int value)
{
Stopwatch watch = new Stopwatch();
watch.Start();
try
{
// code
}
catch(Exception ex)
{
}
watch.Stop();
_logger.Write("Method took: " + watch.Elapsed.Seconds);
return 10;
}
我的想法也是用Mono.Cecil添加此代码。 (只有在方法上方定义了Attribut时才应添加代码)。 这适用于类型为void的方法。但是,如果我有一个返回一些东西的方法。我想我会遇到问题,因为我添加了代码,因此操纵堆栈。并且返回值存储在statck中,据我所知。
还有其他方法吗? Cecil仅适用于未加载的程序集。有没有办法在运行时将此代码添加到已定义此属性的方法中? 如果没有其他方法,我如何在cecil的方法或函数结尾添加代码?
答案 0 :(得分:2)
我认为你应该尝试在运行时加载基于小接口的插件。然后,您可以根据需要加载任意数量的实现,甚至可以动态生成新的C#代码(实现)。在运行中,您可以使用反射生成代码,甚至可以将纯文本写入文件,然后使用cs.exe进行编译。
您可以查看以下文章: