C#在运行时或使用Mono.Cecil将代码添加到方法

时间:2015-05-05 13:24:01

标签: c# mono mono.cecil

对于我的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的方法或函数结尾添加代码?

1 个答案:

答案 0 :(得分:2)

我认为你应该尝试在运行时加载基于小接口的插件。然后,您可以根据需要加载任意数量的实现,甚至可以动态生成新的C#代码(实现)。在运行中,您可以使用反射生成代码,甚至可以将纯文本写入文件,然后使用cs.exe进行编译。

您可以查看以下文章:

Working with the C# 2.0 Command Line Compiler

Compiling C# Code at Runtime

Dynamic Load .NET Assembly