编译一个方法,好像它是另一个类的一部分

时间:2016-10-30 18:42:23

标签: c# mono.cecil

我正在寻找可以编译方法的东西,就好像它在不同的类中一样,这样我就可以注入一个使用内部字段和类型的方法,而无需手动更改操作数值。

例如,如果我们需要获取调试值:

class bla{
internal string importantValue;
...
public void onInitialize(){
    ...
    //this is where the compiler should be made to think it is
}
}

以及进入编译器的代码

public void onInitialize(){ //code to be compiled as if it were in that method
    File.WriteAllText("usefulString.txt",importantValue.toString());
}

然后我们可以得到已编译输出的il并将其插入到 bla.onInitialize 中,以便我们现在可以得到我们的值

2 个答案:

答案 0 :(得分:0)

使用给出的示例,使onInitialize()受保护,然后在另一个类中构造覆盖将起作用。

或者使方法的主体成为在类级别定义的委托 - 然后在代码中设置一个不同的委托以使其执行其他操作。

答案 1 :(得分:0)

我真的没有得到你想要的东西,我认为有一种更简单的方法。

但是如果我从你的问题标题中理解,你想要编译你的类bla(例如),你希望在方法onInitialize中添加新代码(不会退出那里) )在编译时。这是真的吗?

为此你有几种方法。我将描述其中两个。

  1. 您可以使用StaticProxy.Fody之类的库。这个lib让你拦截方法并注入任何你想要的东西。因此,在您的示例中,您拦截了onInitialize方法并添加了此代码File.WriteAllText("usefulString.txt",importantValue.toString()); 所有这些都在编译时。编译代码后,您的输出dll将包含此注入的代码。

  2. 第二个选项是定期编译你的代码,之后你可以使用Mono.Cecil来读取已编译的dll并编写代码,将你想要的任何东西添加到你想要的地方(在我们的例子中,添加保存此dll后,File.WriteAllText etc.onInitialize)将包含新注入的代码。

  3. 这两个选项都是以静态方式添加代码的简单方法(也就是编译时而不是运行时)。