tag:blogger.com,1999:blog-4500363753981919783.post1403511005886368157..comments2023-10-03T22:06:50.708+08:00Comments on Huan-Lin 學習筆記: 開放原始碼的 .NET 反組譯工具 - ILSpyMichael Tsaihttp://www.blogger.com/profile/00364693770445538641noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-4500363753981919783.post-48383786797776985712012-01-05T22:15:37.678+08:002012-01-05T22:15:37.678+08:00我想原因大概就跟正文中最後補充的那段引用官網的文字有關:目前的 ILSpy v1.0 尚未支援 ex...我想原因大概就跟正文中最後補充的那段引用官網的文字有關:目前的 ILSpy v1.0 尚未支援 expression tree。由於有些 LINQ to EF 的語法會被 C# 編譯器編譯成 expression tree 的 statement,所以ILSpy 只是老實照翻,而沒有把它逆向轉回原本的簡易語法。這部分的語法支援據說會在 ILSpy v2.0 提供。多謝你的追根究柢 ^^Michael Tsaihttps://www.blogger.com/profile/00364693770445538641noreply@blogger.comtag:blogger.com,1999:blog-4500363753981919783.post-80126909494538100792012-01-05T17:16:30.296+08:002012-01-05T17:16:30.296+08:00感謝Huanlin Tsai老師的指正!!
經過我的實驗,果然如同老師所說,單純的Linq是不會有問...感謝Huanlin Tsai老師的指正!!<br />經過我的實驗,果然如同老師所說,單純的Linq是不會有問題的<br /><br />不過秉持著追根究底的精神<br />我還原了案發現場<br /><br />原本程式:<br />private static void Main(string[] args)<br />{<br />var db = new TestDatabaseContext();<br /><br />var datas = db.People<br />.Where(r => r.Name == "Angel")<br />.Select(r => r.Name);<br />}<br /><br />.NET Reflector:<br />private static void Main(string[] args)<br />{<br />TestDatabaseContext db = new TestDatabaseContext();<br />IQueryable datas = from r in db.People<br />where r.Name == "Angel"<br />select r.Name;<br />}<br /><br />ILSpy:<br />private static void Main(string[] args)<br />{<br />TestDatabaseContext db = new TestDatabaseContext();<br />IQueryable arg_71_0 = db.People;<br />ParameterExpression parameterExpression = Expression.Parameter(typeof(People), "r");<br />IQueryable arg_B1_0 = arg_71_0.Where(Expression.Lambda>(Expression.Equal(Expression.Property(parameterExpression, (MethodInfo)MethodBase.GetMethodFromHandle(ldtoken(get_Name()))), Expression.Constant("Angel", typeof(string)), false, (MethodInfo)MethodBase.GetMethodFromHandle(ldtoken(op_Equality()))), new ParameterExpression[]<br />{<br />parameterExpression<br />}));<br />parameterExpression = Expression.Parameter(typeof(People), "r");<br />IQueryable datas = arg_B1_0.Select(Expression.Lambda>(Expression.Property(parameterExpression, (MethodInfo)MethodBase.GetMethodFromHandle(ldtoken(get_Name()))), new ParameterExpression[]<br />{<br />parameterExpression<br />}));<br />}<br /><br />這是一段以EF存取DB的範例程式<br />出現了我所說的情況<br />所以我猜想也許是EF或是IQueryable造成的<br />如果跟IQueryable有關<br />說不定Linq to SQL也會有相同的問題(猜的)<br />以上<br />謝謝Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-4500363753981919783.post-87425218435964632942012-01-05T15:38:54.848+08:002012-01-05T15:38:54.848+08:00作者已經移除這則留言。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-4500363753981919783.post-70762258017231002382012-01-04T22:50:43.331+08:002012-01-04T22:50:43.331+08:00感謝 Nicholas 的分享。我針對這部分做了點簡單的測試,並且補充在正文裡。看起來,ILSpy ...感謝 Nicholas 的分享。我針對這部分做了點簡單的測試,並且補充在正文裡。看起來,ILSpy 是支援 LINQ 語法的,但目前並未支援 expression tree,我猜想這可能是你所碰到的狀況。Michael Tsaihttps://www.blogger.com/profile/00364693770445538641noreply@blogger.comtag:blogger.com,1999:blog-4500363753981919783.post-25445652598211895902012-01-04T14:42:22.721+08:002012-01-04T14:42:22.721+08:00我小試了一下
ILSpy反組譯後的內容與原程式碼相去較遠
而.NET Reflector較接近
尤其...我小試了一下<br />ILSpy反組譯後的內容與原程式碼相去較遠<br />而.NET Reflector較接近<br />尤其是程式碼中若包含Linq語句<br />ILSpy反組譯後的結果幾乎沒有可讀性, 也無法編譯<br />相較於這點, .NET Reflector表現則優異許多<br /><br />至於為什麼ILSpy反組譯Linq會讓人看不懂??<br />因為它拆太細了, 拆到變成Expression Tree<br />而非標準Linq表達式Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-4500363753981919783.post-80289033168775586122012-01-02T23:36:52.865+08:002012-01-02T23:36:52.865+08:00Thanks :)Thanks :)Michael Tsaihttps://www.blogger.com/profile/00364693770445538641noreply@blogger.comtag:blogger.com,1999:blog-4500363753981919783.post-53975599900521943212012-01-02T16:11:18.848+08:002012-01-02T16:11:18.848+08:00功能不比 .NET Reflector差 <-- 少了一個字功能不比 .NET Reflector差 <-- 少了一個字陳傳興https://www.blogger.com/profile/14720896380519694038noreply@blogger.comtag:blogger.com,1999:blog-4500363753981919783.post-63785536423330396362012-01-02T16:06:41.420+08:002012-01-02T16:06:41.420+08:00在我的文章Visual Basic for Reflection(http://blog.kkbru...在我的文章Visual Basic for Reflection(http://blog.kkbruce.net/2011/09/visual-basic-reflection-2.html#.TwFlHflu6pQ)中有提到一套Telerik JustDecompile,目前是免費使用,功能不比 .NET Reflector,提供給你參考。陳傳興https://www.blogger.com/profile/14720896380519694038noreply@blogger.com