首页 新闻 会员 周边

在VS中怎么用reflector调试?reflector使用若干问题

0
悬赏园豆:10 [已关闭问题] 关闭于 2012-01-19 13:23

1.如下图,和很多网上讲的过程一样,我已经将reflector集成到vs 2008中,也已经将Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll程序集反编译,但是为什么调试时在assert断点处按F11进不去reflector反编译出来的代码?怎么才能在VS中用reflector调试?

2.我用reflector查看Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll里面的assert这个函数,一步一步跟到底儿,判断相等的是这么几个语句(红色的是我一步步点进去的):

 1 public static void AreEqual(object expected, object actual)
2 {
3 AreEqual(expected, actual, string.Empty, null);
4 }
5
6
7 public static void AreEqual(object expected, object actual, string message, params object[] parameters)
8 {
9 AreEqual<object>(expected, actual, message, parameters);
10 }
11
12
13
14
15 public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
16 {
17 if (!object.Equals(expected, actual))
18 {
19 string str;
20 if (((actual != null) && (expected != null)) && !actual.GetType().Equals(expected.GetType()))
21 {
22 str = (string) FrameworkMessages.AreEqualDifferentTypesFailMsg((message == null) ? string.Empty : ReplaceNulls(message), ReplaceNulls(expected), expected.GetType().FullName, ReplaceNulls(actual), actual.GetType().FullName);
23 }
24 else
25 {
26 str = (string) FrameworkMessages.AreEqualFailMsg((message == null) ? string.Empty : ReplaceNulls(message), ReplaceNulls(expected), ReplaceNulls(actual));
27 }
28 HandleFail("Assert.AreEqual", str, parameters);
29 }
30 }
31
32
33
34
35 public static bool Equals(object objA, object objB)
36 {
37 return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
38 }
39
40
41 public virtual bool Equals(object obj)
42 {
43 return InternalEquals(this, obj);
44 }
45
46
47
48
49 [MethodImpl(MethodImplOptions.InternalCall)]
50 internal static extern bool InternalEquals(object objA, object objB);
51

 

其中35行这个函数:

我传进来的参数objA和objB是UserList类的两个对象,在UserList类中我已经实现了“==”、“!=”、Equals()和GetHashCode()的重载,在Equals()的重载中只是单纯调用重载的“==”进行判断;

调试Assert后发现,程序是在执行UserList类重载的Equals()函数时才执行过一次重载的“==”,而从未直接执行过重载的“==”方法,也就是说37行的(objA==objB)执行的是Object类自己的“==”方法(Object自带的==运算符是检查引用相等,这两个对象的值相等但引用不等,所以返回了false;所以虽然是短路运算符“||”,但是前面返回了false,就要继续验证后面表达式的值);

而如果将35行函数的签名改为(当然这是MS内部的函数不能修改,我自己编了个一样的试了一下):

public static bool Equals(UserList objA,UserList objB)

就会成功执行UserList类的Equals方法了,这个原因是?能详细说明一下吗

还有我的问题是:37行后的objA.Equals(objB)为什么可以执行到UserList类自己的Equals()函数?难道它先执行的是Object自带的Equals(),从这里又调用了UserList的Equals??可是Object自带的Equals函数不是只检查引用相等吗?

 

3.  49行这个函数跟不进去了,这个标有extern的方法应该是在类的外部定义的,很可能使用别的语言,我怎么能找到这个extern方法的定义在哪儿?

Jessie.M的主页 Jessie.M | 初学一级 | 园豆:181
提问于:2012-01-17 14:14
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册