2013-01-13 121 views
1

动态方法可以像普通方法或代码一样工作,因为它可以访问通常可以访问变量的变量,调用方法和初始化变量(当然在方法范围内)?DynamicMethod可以访问变量以外的变量吗?

我见过的唯一的例子是它传递一些参数和返回某个值,并且无助于改变它之外的任何变量。

我谈论的System.Reflection.Emit.DynamicMethod类。我无法理解它,因为我需要使用MSIL,但我还不太了解。

+0

我不熟悉你正在谈论的确切功能(Emit.DynMeth),但是你想要的最终结果当然是可能的。我现在正在做类似的事情,尽管我对此有不同的看法。让我知道如果这有助于http://stackoverflow.com/questions/14146006/reading-a-recipe-to-control-data-processing-steps – HodlDwon

+0

关于DynamicMethod:“定义和表示一个动态方法,可以编译,执行,并放弃。“ - 我想用它来自动生成代码,以便在更大的应用程序中运行。我试图做到这一点,而不是去两个应用程序域的路线。 – user1594138

回答

1

是的。一个DynamicMethod可以附加到一个类,在这种情况下,它可以访问类 - 私有静态字段(如果DynamicMethod是一个实例方法,可能还有类 - 私有字段,但我不记得这是否是受支持的方案)。它还可以访问创建DynamicMethod的程序集内部的程序集内部方法,属性和类型。

什么是您使用的是动态方法的情况?

我对动态编程的一些博客文章,其中包括如何使用我的博客上的DynamicMethod的类一对夫妇的条目:http://robpaveza.net/tag/dynamic-programming。具体来说,this article谈论如何计算文件修订证明,你可以看到结果实现here(显然,我从来没有写过第2部分,但是我在BN#中实现的链接是分析的结果)。

让我带你通过编译方法:

  1. 类型参数类型= typeof运算(UINT).MakeByRefType()

的最后一个方法是要拿出UINT参数;这一行获得对uint-ref运行时类型的引用。如果我将它写入普通C#中,方法声明看起来像这样:

public static void CheckRevision(out uint a, out uint b, out uint c, out uint s); 

38-40。的foreach(公式中的字符串公式)CompileStandardFormula(发电机,公式)

正如我在我的博客文章关于它提了,我做数学题的形式总是提供:

A=A-S B=B-C C=C+A A=A+B 

其中A, B和C是状态变量,S是输入(来自文件的下一个uint值)。

的CompileStandardFormula功能发出,计算对于所示的四种中的一个单独的操作逻辑的IL。回想一下,CLR是一个基于堆栈的状态机,并且数据操作发生时,堆栈中的值被弹出并且结果被推送。因此,对于A =,例如,下面的IL是什么会发出:

ldarg.0 // push &A, which is a reference to the location that actually contains the value of A 
ldarg.0 // push &A 
ldind.u4 // dereference the top-most value on the stack, which puts the actual value of &A ready for operation 
ldarg.3 // push &S 
ldind.u4 // dereference &S 
sub  // subtracts [stack-1] from [stack-2], which effectively is A-S 
stind.u4 // remember the first ldarg.0? That's getting accessed now and the subtraction result is going there 

所以,在这一点上,它应该很容易弄清楚:我DynamicMethod的编译更新所需的数学运算文件中单次传递的所有状态变量。在所有的IL被释放后,因为我们知道堆栈的状态没有任何东西(比方法进入的时候多),我们可以抛出一个快速的'ret'指令,我们就完成了。

无论如何,希望这是有帮助的。

+0

感谢您的回答。那么它只是我自己的一个应用程序,但我试图尽可能快地将用户定义的公式/数学应用于大量数据并收集汇总结果。现在我有一个应用程序读取我的公式,并将它们输入到Visual Studio解决方案并编译并运行它。如果公式可以放入一个不需要一次又一次编译的正在运行的应用程序中,那将会很棒。但我仍然希望公式被编译,而不是解释。所以这就是我想要以最简单的形式做的事情。 – user1594138

+0

DynamicMethod是你正在做的一个很好的方法。 IL是最难的部分,但是明智地使用手工编写C#代码,编译它,然后在ILDASM中查看它将会带给你很大的帮助! – Rob

+0

再次感谢您的答案,但我可能会略微偏离主题,但我只注意到了这件事:http://codeinject.codeplex.com/ - 我不知道它是什么,但它似乎可能是有用的我。你知道这是什么吗?谢谢。 – user1594138

相关问题