RSS 2.0 Feed
2004-04 Entries
摘要:Flier说我是CLR Team的。这个不对。我是Fusion team的。 Alan的说法:(So what is Fusion, anyway?) 我的说法:(http://blogs.msdn.com/junfeng/archive/2004/01/28/63783.aspx) 三个月前Fusion包括Fusion/CLR(在CLR Loader里), Fusion/Win32(在NT Loader里), 和ClickOnce。刚有过一次重组,ClickOnce和我们告别了。 有关Fusion的Blog:Fusion/CLR: Alan, meFusion/Win32:MGrierClickOnce:Micheal Dunn MGrier是我见过的最好的Engineer之一。...[阅读全文]

posted @ | Feedback (1) | Filed Under [ General ]

摘要:这是我以前写的一个小工具,也许对大家有帮助。 http://blogs.msdn.com/junfeng/archive/2004/02/28/81396.aspx 需要管理员权限。...[阅读全文]

posted @ | Feedback (0) | Filed Under [ .Net ]

摘要:http://blogs.msdn.com/mdunn 他是ClickOnce的PM。ClickOnce的问题可以去他的Blog上问。当然,用英文。 PS:他的名字是Micheal, 不是Michael。...[阅读全文]

posted @ | Feedback (1) | Filed Under [ General ]

摘要:Flier Lu问到CLR Loader和Java Class Loader有什么不一样。要回答这个问题不容易,因为我对Java一窍不通。但既然问题提出来了,打肿脸来充胖子也得回答啊。   于是今天下午我在google上逛了一圈,找了些关于Java Class Loader的文章看了看。我的结论是,和Java Class Loader类似的东东,在CLR里是不存在的。   简单的说,CLR里不存在一个类似于Java.Lang.ClassLoader的东西。所以你无法实现你自己的CLR Loader。CLR里只有一个Loader,那就是CLR Loader。当然,CLR提供了自己独特的方式让你做动态装载。你所拥有的自由度是远比Java要大得多。   下面是具体分析。   我对Java Class Loader的理解主要是从这两篇文章里来的。 “Inside Class Loader” by Andeas Schaefer (http://www.onjava.com/lpt/a/4337) 和 “The basics of Java Class Loaders” by Chuck McManis (http://www.javaworld.com/javaworld/jw-10-1996/jw-10-indepth_p.html)。我看了看JVM Spec。但是我觉得不如上面两篇文章清楚。   先说Java里的Type吧。Java里的Type就是Class 。Class就是Namespace + class name.  Class通过Class Loader来装载的。System Class Loader缺省的话只在CLASSPATH中寻找Class。如果你要在CLASSPATH之外转载Class的话,你就需要自己的Class Loader。如果两个Class有相同的名字,并且在同一个Class Loader里,那么它们就被JVM认为是相同的,可以互相赋值。如果有一个不一样的话,它们就被认为是不一样的。互相赋值会发生ClassCaseException。换句话说,Class name + Class Loader是一个Type的独特的ID。   Java的这个模型有很多问题。首先它把Class name做为Type的ID。两个Class如果有同样的名字,但是实际内容不一样的话,如果它们被同一个Class Loader装载,JVM会认为它们是同一个 Type。这个太搞笑了。结果就是Class Loader必须要有一些特别的办法来管理Class name。一般的办法是加一个前缀,比如说Class的URL。如果Namespace管理不好的话,很容易就是安全漏洞。这是为什么JVM Spec里提到Class Loader必须要让Parent Class Loader先搜索Class,再自己寻找。而且Class loader必须要保存Class resolution的结果,这样下次Class resolution的时候,Class loader会返回同样的结果。Java Class Loader有太多的限制,同时又有太多的责任。   另一个问题是共享问题。如果同一个Class被两个不同的Class Loader装载的话,JVM认为这两个Class不是同一个Type,不能互相赋值。结果就是Class无法共享。被不同Class Loader装载的Class无法直接对话。直接对话会产生linkage错误。它们只能间接对话,比如通过Interface,或者共同的Base Class。   还有一个问题是Versioning。因为Java的Type里只有名字,所以当你看到一个Type的时候,你无法知道它是第一版,还是第二版。所以如果你需要第二版,但是Class loader给你装载了第一版的时候,祈祷吧。也许上帝能救你。   现在回过头来看看CLR的模型。CLR的Type包括两部分:Class name + Assembly Name。Class name是和 Java的Type类似的东西,就是namespace。Assembly是Java没有的东西。Assembly Name的属性包括Name, Version, Culture, PublicKey(Token)。 如果两个Assembly有一个属性不一样,那么它们就认为是不一样的。两个Type如果有同样的Class name,但是Assembly Name不一样的话,它们也认为是不一样的。   CLR的Type引用总是包括Class name 和 Assembly Name的。所以CLR在寻找一个Type的时候,主要是寻找Assembly。找到了Assembly之后,CLR看看这个Assembly里有没有这个Class。有的话就万事大吉,没有的话就是TypeLoadException。   CLR区别Type主要靠Assembly。Assembly有PublicKey(Token)。别人无法冒充你。所以象Java里的namespace的问题就不存在了。Assembly有自己的Version。你要第二版的时候CLR不会装载第一版给你。所以象Java Class Loader那样的限制,责任和问题都不存在了。从这个角度上讲,这正是为什么CLR里没有象Java Class Loader那样的东西。   但并不是说你就不能动态装载了,而是说你动态装载的时候就不用考虑那些垃圾了。   关于共享的问题,因为没有了你自己的Class loader,所以任何Type都可以直接对话。同样的Type也不会因为Class Loader不一样而被认为不一样。   CLR Loader有自己的规则怎么寻找Assembly。它先看GAC,再看你的程序目录。都没有的话它还有一个AssemblyResolveEvent去问你,看你能不能提供。如果你要动态装载的话,你有Assembly.Load, Assembly.LoadFrom, Assembly.LoadFile, Assembly.Load(byte[])。你可以提供privateBin,你也可以提供codebase hint。你还能有policy。总之,你想从哪找,就可以去哪找。细节问题我就不多说了。你可以去看MSDN,Suzanne的Blog,Alan的Blog,和我的英文Blog.   结论,CLR......[阅读全文]

posted @ | Feedback (18) | Filed Under [ .Net ]

摘要: 我在weblogs.asp.net上写过一篇文章,反驳Jeffrey Richter关于为什么不应该用ngen的原因。 Flier Lu 做了翻译和解释 http://www.blogcn.com/user8/flier_lu/main.asp?id=1550010。 特别感谢Flier Lu....[阅读全文]

posted @ | Feedback (2) | Filed Under [ .Net ]

摘要:joycode上的朋友有多少是自己做饭的? 我举半只手...[阅读全文]

posted @ | Feedback (35) | Filed Under [ General ]

摘要:这边的中文台正在放香港电视连续剧《万家灯火》。已经72集了,还没有完。 这部连续剧通过一家人的故事,来反映香港几十年来的变化。 觉得里面最好的就是大家庭的感觉。那是我们在国外无法感受到的。...[阅读全文]

posted @ | Feedback (4) | Filed Under [ Other ]

摘要:CLR Loader是CLR的一部分。CLR包括Loader, Security, GC, JIT, Managed Type System, BCL,和一些相关的部分,比如debugging, profiling, exception, hosting等等。   Loader的作用就是让你的程序开始运行。   Loader的运行从Type Reference开始.   任何一个变量都有一个Type。Type 包括Assembly, class. 如果你看你程序的IL的话,你经常能看到[mscorlib]System.Object或者类似的。Mscorlib是assembly,System.Object是class。   当CLR Loader看到这样一个Type的时候,它首先看看这个assembly是不是已经被装载了。如果没有的话,那么它就按照一定的规则去寻找这个assembly。没找到的话你就会被呈上一个FileNotFoundException。如果找到了,它就看这个assembly里是不是有这样一个class。没有的话你又会收到一个TypeLoadException。如果有的话,大功告成,Loader就告诉JIT说有人要用这东西,程序在这里。JIT就开始编译你的程序,然后你的程序就开始运行了。   就BCL里能看到的东西, System.AppDomain, System.Assembly, System.Type, System.AppDomainSetup 都是属于CLR loader的。   当然,实际上是比这要复杂得多的...[阅读全文]

posted @ | Feedback (19) | Filed Under [ .Net ]

摘要:初来乍到,请多关照。 我在微软Fusion team工作。我和彭刚在一个大组里卖命。 我对CLR loader比较熟悉。那方面的问题可以找我。 我的英文blog在http://weblogs.asp.net/junfeng。 Suzanne(http://weblogs.asp.net/suzcook) 和 Alan (http://weblogs.asp.net/alanshi)的blog上有很多关于CLR Loader和Fusion的文章,有问题的话看看他们的blog,也许已经有答案了。 用中文交流的一个问题是很多术语不知道如何翻译。不知道哪里有中英术语对照翻译?...[阅读全文]

posted @ | Feedback (14) | Filed Under [ General ]