我正在尝试学习CIL代码,但无法理解一个函数的返回值是如何作为参数传递给另一个函数的。
我已经为以下函数生成了CIL代码:
public bool TestWebPage()
{
WebRequest request = WebRequest.Create("http://www.costco.com");
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
}CIL代码:
//000021: public void TestWebPage()
//000022: {
IL_0000: /* 00 | */ nop
.line 23,23 : 7,71 ''
//000023: WebRequest request = WebRequest.Create("http://www.costco.com");
IL_0001: /* 72 | (70)000001 */ ldstr "http://www.costco.com" /* 70000001 */
IL_0006: /* 28 | (0A)000012 */ call class [System/*23000003*/]System.Net.WebRequest/*01000016*/ [System/*23000003*/]System.Net.WebRequest/*01000016*/::Create(string) /* 0A000012 */
IL_000b: /* 0A | */ stloc.0
.line 24,24 : 7,70 ''
//000024: request.Proxy.Credentials = CredentialCache.DefaultCredentials;
IL_000c: /* 06 | */ ldloc.0
IL_000d: /* 6F | (0A)000013 */ callvirt instance class [System/*23000003*/]System.Net.IWebProxy/*01000017*/ [System/*23000003*/]System.Net.WebRequest/*01000016*/::get_Proxy() /* 0A000013 */
IL_0012: /* 28 | (0A)000014 */ call class [System/*23000003*/]System.Net.ICredentials/*01000019*/ [System/*23000003*/]System.Net.CredentialCache/*01000018*/::get_DefaultCredentials() /* 0A000014 */
IL_0017: /* 6F | (0A)000015 */ callvirt instance void [System/*23000003*/]System.Net.IWebProxy/*01000017*/::set_Credentials(class [System/*23000003*/]System.Net.ICredentials/*01000019*/) /* 0A000015 */
IL_001c: /* 00 | */ nop
.line 25,25 : 7,73 ''具体来说,我无法理解CIL代码中的以下内容:
发布于 2011-03-21 22:35:36
发布于 2011-03-21 22:37:25
都是基于堆栈的。所发生的情况是将调用返回值get_DefaultCredentials的方法的结果推送到计算堆栈中。
没有神奇的链接,值恰好驻留在堆栈的顶部。
只需查看构造函数调用,首先发生的事情是将字符串"http://www.costco.com"推到计算堆栈的顶部。然后调用构造函数。然后,构造函数弹出计算堆栈的值。最后一个推到堆栈顶部的值是最后一个参数。ldstr在堆栈顶部精确地推送一个值。构造函数调用的结果,它现在是顶部,该引用随后弹出并存储在位置0 stloc.0 (一个局部变量)中。
调用实例方法略有不同,在这种情况下,第一个参数总是对象,所以这里看到的第一个调用是ldloc.0。它将WebRequest对象实例推到计算堆栈的顶部。在这里,我们调用get_Proxy方法,它使用ldloc.0放在那里的计算堆栈顶部的值,并返回返回的对象实例。这有效地替换了计算堆栈顶部的值。但是,现在堆栈的顶部不再是ldloc.0放在那里的值了。
没有什么是真正的传递,它只是推和弹出,关闭和在堆栈上。
https://stackoverflow.com/questions/5384459
复制相似问题