我正在寻找可以编译方法的东西,就好像它在不同的类中一样,这样我就可以注入一个使用内部字段和类型的方法,而无需手动更改操作数值。
例如,如果我们需要获取调试值:
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 中,以便我们现在可以得到我们的值
答案 0 :(得分:0)
使用给出的示例,使onInitialize()受保护,然后在另一个类中构造覆盖将起作用。
或者使方法的主体成为在类级别定义的委托 - 然后在代码中设置一个不同的委托以使其执行其他操作。
答案 1 :(得分:0)
我真的没有得到你想要的东西,我认为有一种更简单的方法。
但是如果我从你的问题标题中理解,你想要编译你的类bla
(例如),你希望在方法onInitialize
中添加新代码(不会退出那里) )在编译时。这是真的吗?
为此你有几种方法。我将描述其中两个。
您可以使用StaticProxy.Fody之类的库。这个lib让你拦截方法并注入任何你想要的东西。因此,在您的示例中,您拦截了onInitialize
方法并添加了此代码File.WriteAllText("usefulString.txt",importantValue.toString());
所有这些都在编译时。编译代码后,您的输出dll将包含此注入的代码。
第二个选项是定期编译你的代码,之后你可以使用Mono.Cecil
来读取已编译的dll并编写代码,将你想要的任何东西添加到你想要的地方(在我们的例子中,添加保存此dll后,File.WriteAllText etc.
到onInitialize
)将包含新注入的代码。
这两个选项都是以静态方式添加代码的简单方法(也就是编译时而不是运行时)。