.NET Framework FAQ

×÷ÕßAndy McMullan  ÒëÕß ÈÙÒ«

¸üÐÂÈÕÆÚ£º 2002-09-10

ÕâÆªFAQÊÔͼ»Ø´ð¹ØÓÚ.NET Framework»ù±¾Ô­ÀíµÄһЩ³£¼ûÎÊÌ⡣˵µ½»ù±¾Ô­Àí£¬ÎÒÊÇÖ¸.NET Frameworkµ×²ãÔË×÷»úÖÆµÄ¾ßÌåϸ½Ú£¬ÌÖÂÛÖ÷Ìâ°üÀ¨Åä¼þ£¨assemblies£©¡¢À¬»øÊÕ¼¯»úÖÆ¡¢°²È«ÐÔ¡¢COM»¥²Ù×÷ÒÔ¼°Ô¶³Ì»¯£¨remoting£©µÈ£¬²¢º­¸ÇÀà¿â×î³£ÓõIJ¿·Ö¡£ÖÁÓÚ.NET FrameworkµÄÆäËü·½Ã棬±ÈÈçASP.NET¡¢ADO.NETºÍWinForms£¬²»ÔÚ±¾FAQÌÖÂÛ·¶Î§¡£

ÕâÆªFAQµÄÁé¸ÐÀ´×ÔÓÚDOTNETÓʼþÁÐ±í¡£¼ÙÈçÄ㻹ûÓгÉΪÕâ¸öÓʼþÁбíµÄ³ÉÔ±£¬¿ÉÒԴӴ˼ÓÈ룺http://discuss.develop.com/dotnet.html¡£ÔÚÕâ¶ù»¹¿ÉÒÔ²éÔÄÓʼþÁÐ±í´æµµÎļþ¡£

¼ÙÈçÄãÓÐÈÎºÎÆÀ×¢¡¢½¨Òé¡¢¸üÕý»òÅúÆÀ£¬Çë¸øÎÒдÐÅ£¨andy@andymcm.com£©¡£

¼ÙÈçÄã¶ÔC#¸ÐÐËȤ£¬ÎªÊ²Ã´²»¿´¿´Îҵġ°C# FAQ for C++ programmers¡±ÄØ£¿£¨Ó¢ÎÄ£ºhttp://www.andymcm.com/csharpfaq.htm£¬ÖÐÎÄ£ºhttp://www.royaloo.com/articles/articles_2002/CSharpFAQ.htm£©

ÉùÃ÷1£ºÕâÆªFAQ²»¹ýÊÇÎÒ¶Ô´ÓÐÎÐÎɫɫµÄÇþµÀËѼ¯µ½µÄÐÅÏ¢µÄ¸öÈ˲ûÊö¶øÒÑ£¬À´Ô´°üÀ¨DOTNETÓʼþÁбíÒÔ¼°Î廨°ËÃŵÄ΢ÈíÎĵµ¡£ÕâЩ´ð°¸²¢·Ç¶àôµÃÍ걸£¬ÉõÖÁ¿ÉÄܲ»ÍêÈ«ÕýÈ·¡£¼´Ê¹ÕâЩ´ð°¸½ñÌìÊÇÕýÈ·µÄ£¬Ëµ²»¶¨Ã÷Ìì¾Í²»ÔÙÈç´Ë¡£

ÉùÃ÷2£ºÕâÆªFAQºÍDOTNETÓʼþÁбí»òDevelopmentor£¨°Ñ³ÖÕâ¸öÁбíµÄ¹«Ë¾£©»ò΢ÈíûÓÐÈκÎÕýʽÁªÏµ¡£

ÐÞ¶©ÀúÊ·

2002-07-09  ¼ÓÈëÐòÁл¯Ò»½Ú

2002-06-07  ÐÞÕû¡°×ÊÔ´¡±²¿·Ö£¬¼ÓÈëеÄÊé¼®ÍÆ¼öºÍWeblogsÖ÷Ìâ

2002-01-17  ºÜСµÄ¸üУ¬ÒÔ·´Ó³°æ±¾1µÄÀ´ÁÙ

2001-08-20  ¸üÐÂËùÓдúÂëÑùÀý£¬Ê¹ÆäÍêÈ«¼æÈÝÓÚBeta 2¡£

2002-06-28  ºÜСµÄ¸üУ¬ÒÔ·´Ó³Beta2µÄµ½À´¡£

2000-11-18  Ïò¡°Àà¿â¡±Ò»½Ú£¬¼ÓÈë¡°¸ú×Ù¡±×ÓС½Ú

2000-11-13  ΪBeta1µÄµ½À´¶ø¸üÐÂ

2000-11-09  ×ÅÊÖ±àд¡°Àà¿â¡±Ò»½Ú

2000-11-03  ¼ÓÈë¡°IL¡±Ò»½Ú

2000-10-14  ¼ÓÈë¡°´úÂë·ÃÎʰ²È«¡±Ò»½Ú

2000-08-29  ¿ªÊ¼Î¬»¤¡°ÐÞ¶©ÀúÊ·¡±

2000-07-29 ÖÁ 2000-08-28  ÔÓÆßÔӰ˵ĸüУ¨Ã»×÷¼Ç¼£©

2000-07-29  ¹«²¼±¾FAQµÚÒ»°æ

ÄÚÈÝ

1. µ¼ÑÔ

1.1 ʲôÊÇ .NET£¿

1.2 .NETÖ»ÊÊÓÃÓÚ¹¹½¨webÕ¾µãÂð£¿

1.3 .NETÊÇʲôʱºòÐû²¼µÄ£¿

1.4 .NET µÚÒ»°æ·¢²¼ÈÕÆÚÊÇ£¿

1.5 ÎÒ¿ÉÒÔʹÓÃʲôÑùµÄ¹¤¾ßÀ´¿ª·¢.NETÓ¦Óã¿

1.6 .NET FrameworkÔËÐÐÓÚºÎÖÖÆ½Ì¨Ö®ÉÏ£¿

1.7 .NET FrameworkÖ§³ÖÄÄЩÓïÑÔ£¿

1.8 .NET Framework½«»á±ê×¼»¯Âð£¿

2. »ù±¾ÊõÓï

2.1 ʲôÊÇCLR£¿

2.2 ʲôÊÇCTS£¿

2.3 ʲôÊÇCLS£¿

2.4 ʲôÊÇIL£¿

2.5 ʲôÊÇC#£¿

2.6 ÔÚ.NET»·¾³Ï£¬¡°Íйܣ¨managed£©¡±Ò»´ÊµÄº¬ÒåÊÇ£¿

2.7 ʲôÊÇ·´É䣨reflection£©£¿  

3. Åä¼þ£¨Assemblies£©

3.1 ʲôÊÇÅä¼þ£¿

3.2 ÎÒÔõÑùÉú³ÉÒ»¸öÅä¼þ£¿

3.3 ˽ÓÐÅä¼þ£¨private assembly£©ºÍ¹²ÏíÅä¼þ£¨shared assembly£©Ö®¼äÓÐÊ²Ã´Çø±ð£¿

3.4 Åä¼þÊÇÈçºÎ±Ë´Ë·¢Ïֵģ¿

3.5 Åä¼þµÄ°æ±¾Ð­µ÷»úÀíÊÇÔõÑùµÄ£¿  

4. Ó¦ÓÃÓò£¨Application Domains£©

4.1 ʲôÊÇÓ¦ÓÃÓò£¿

4.2 Ó¦ÓÃÓòÊÇÔõô´´½¨³öÀ´µÄ£¿

4.3 ÎÒÄܱàд×Ô¼ºµÄ.NETËÞÖ÷£¨.NET host£©Â𣿠

5. À¬»øÊÕ¼¯£¨Garbage Collection£©

5.1 ʲôÊÇÀ¬»øÊÕ¼¯£¿

5.2 µ±¶ÔÏó×îºóÒ»¸öÒýÓñ»½â³ýʱ£¬ËüÒ²²¢²»×ÜÊÇÁ¢¼´±»Ïú»Ù£¬ÕæµÄÂð£¿

5.3 Ϊʲô.NETÔËÐÐʱ²»Ìṩȷ¶¨ÐÔµÄÏú»Ù»úÖÆ£¿

5.4 ȱ·¦È·¶¨ÐÔµÄÏú»Ù»úÖÆÔÚ.NETÖгɸöÎÊÌâÂð£¿

5.5 ·ÇÈ·¶¨ÐÔÏú»Ù»úÖÆ¶Ô´ÓÍйܴúÂ루managed code£©ÖÐʹÓÃCOM¶ÔÏóÓÐÓ°ÏìÂð£¿

5.6 ÎÒÌý˵Ӧ¸Ã±ÜÃâʹÓÃFinalize·½·¨£¬ÎÒÓ¦¸ÃÔÚÎÒµÄÀàÀïʵÏÖFinalize·½·¨Âð£¿

5.7 ÎÒÄܶÔÀ¬»øÊÕ¼¯Ëã·¨×÷Щ¿ØÖÆÂð£¿

5.8 ÎÒÔõô²ÅÄÜ¿´³öÀ´À¬»øÊÕ¼¯Æ÷ÕýÔÚ¸ÉЩʲôÊ£¿ 

6. ÐòÁл¯£¨Serialization£©

6.1 ʲôÊÇÐòÁл¯£¿

6.2 .NET Framework¶ÔÐòÁл¯ÓÐÄÚ½¨Ö§³ÖÂð£¿

6.3 ÎÒÏëÐòÁл¯ÎÒµÄÀàµÄʵÌ壬ÎÒÓ¦¸ÃʹÓà XmlSerializer¡¢SoapFormatterºÍBinaryFormatterÖеÄÄÄÒ»ÖÖ£¿

6.4 ÎÒÄܶ¨ÖÆÐòÁл¯¹ý³ÌÂð£¿

6.5 ΪʲôXmlSerializerÕâôÂý£¿

6.6Ϊʲôµ±ÎÒÊÔͼÐòÁл¯Ò»¸öÉ¢ÁÐ±í£¨Hashtable£©Ê±±¨´í£¿

6.7 XmlSerializerÅ׳öÁËÒ»¸öÒ»°ãÐԵĴíÎ󣺡°ÔÚ·´ÉäMyClassʱ³ö´í¡±£¬ÎÒÔõô²ÅÄܲéÃ÷³öÁËʲôÎÊÌ⣿

7.ÌØÐÔ£¨Attributes£©

7.1 ʲôÊÇÌØÐÔ£¿

7.2 ÎÒ¿ÉÒÔ´´½¨ÎÒ×Ô¼ºµÄÔªÊý¾ÝÌØÐÔ£¨metadata attributes£©Âð£¿

7.3 ÎÒ¿ÉÒÔ´´½¨ÎÒ×Ô¼ºµÄÉÏÏÂÎÄÌØÐÔ£¨context attributes£©Â𣿠 

8. ´úÂë·ÃÎʰ²È«£¨Code Access Security£©

8.1 ʲôÊÇ´úÂë·ÃÎʰ²È«£¨CAS£©£¿

8.2 CASµÄ¹¤×÷»úÀíÊÇÔõÑùµÄ£¿

8.3 Ë­À´¶¨ÒåCAS´úÂë×飨code groups£©£¿

8.4 ÎÒÔõôÀ´¶¨ÒåÎÒ×Ô¼ºµÄ´úÂë×飿

8.5 ÎÒÔõô¸ü¸Ä´úÂë×éµÄȨÏÞ¼¯£¨permission set£©£¿

8.6 ÎÒÄÜ´´½¨×Ô¼ºµÄȨÏÞ¼¯Âð£¿

8.7 ÎÒÓöµ½ÁËһЩCASÂé·³£¬ÎÒÈçºÎ²ÅÄÜÕï¶ÏÊÇʲôµØ·½³öÁ˲î´í£¿

8.8 ÎÒ¶ÔËùÓÐÕâЩCASÍæÒⷳ͸ÁË£¬ÎÒÄܽûÓÃËüÂ𣿠 

9. ÖмäÓïÑÔ£¨Intermediate Language£¬IL£©

9.1 ÎÒÄܲ쿴Åä¼þµÄILÂð£¿

9.2 ÄÜ´ÓIL¡°·´Ïò¹¤³Ì¡±£¨reverse-engineered£©³öÔ´´úÂëÀ´Âð£¿

9.3 ÎÒÔõô²ÅÄÜ·ÀÖ¹ÎҵĴúÂë±»´ÓIL¡°·´Ïò¹¤³Ì¡±³öÀ´£¿

9.4 ÎÒ¿ÉÒÔÖ±½Ó±àдIL³ÌÐòÂð£¿

9.5 ÎÒÄÜÔÚILÖÐ×ö²»ÄÜÔÚC#ÖÐ×öµÄÊÂÇéÂ𣿠 

10. ¹ØÓÚCOMµÄÒ»Ð©ÍÆ¶Ï

10.1 COMËÀµôÁËÂð£¿

10.2 DCOMËÀµôÁËÂð£¿

10.3 MTS/COM+ËÀµôÁËÂð£¿

10.4 ÎÒÄÜÔÚ.NET³ÌÐòÖÐʹÓÃCOM×é¼þÂð£¿

10.5 ÎÒÄÜÔÚCOM³ÌÐòÖÐʹÓÃ.NET×é¼þÂð£¿

10.6 ÔÚ.NETÊÀ½çÀATL³ÉÁ˶àÓàµÄ¶«Î÷Âð£¿

11.ÔÓÏî

11.1 .NET remoting£¨Ô¶³Ì»¯£©µÄ¹¤×÷»úÀíÊÇÔõÑùµÄ£¿

11.2 ÎÒÔõô²ÅÄÜ´Ó.NET³ÌÐòÖзÃÎÊWin32 API£¿

12. Àà¿â

12.1 ÎļþI/O

12.1.1 ÎÒÔõÑù¶ÁÈ¡Îı¾Îļþ£¿

12.1.2 ÎÒÔõÑùдÎı¾Îļþ£¿

12.1.3 ÎÒÔõÑù¶Á/д¶þ½øÖÆÎļþ£¿

12.1.4 ÎÒÔõÑùɾ³ýÒ»¸öÎļþ£¿

12.2 Îı¾´¦Àí

12.2.1 Ö§³ÖÕýÔò±í´ïʽÂð£¿

12.3 Internet

12.3.1 ÎÒÔõÑùÏÂÔØWebÒ³Ãæ£¿

12.3.2 ÎÒÔõÑùʹÓôúÀí£¨proxy£©£¿

12.4 XML

12.4.1 Ö§³ÖDOMÂð£¿

12.4.2 Ö§³ÖSAXÂð£¿

12.4.3 Ö§³ÖXPathÂð£¿

12.5 Ị̈߳¨Threading£©

12.5.1 Ö§³Ö¶àÏß³ÌÂð£¿

12.5.2 ÎÒÔõÑù²úÉúÒ»¸öỊ̈߳¿

12.5.3 ÎÒÔõÑùÍ£Ö¹Ò»¸öỊ̈߳¿

12.5.4 ÎÒÔõÑùʹÓÃÏ̳߳أ¨Thread pool£©£¿

12.5.5 ÎÒÔõô²ÅÄÜÖªµÀÏ̳߳ع¤×÷Ïwork item£©Ê²Ã´Ê±ºò½áÊøÁË£¿

12.5.6 ÎÒÔõô·ÀÖ¹¶ÔÊý¾ÝµÄ²¢·¢·ÃÎÊ£¿

12.6 ¸ú×Ù£¨Tracing£©

12.6.1 ¶Ô¸ú×Ù/ÈÕÖ¾£¨tracing/logging£©ÓÐÄÚ½¨Ö§³ÖÂð£¿

12.6.2 ÎÒÄܽ«¸ú×Ù½á¹ûÖØ¶¨Ïòµ½ÎļþÂð£¿

12.6.3 ÎÒÄܶ¨ÖƸú×ÙÊä³öÂð£¿

13. ×ÊÔ´

13.1 Êé¼®ÍÆ¼ö

13.2 Internet×ÊÔ´

13.3 Weblogs

13.4 ´úÂëÑùÀýºÍ¹¤¾ß

1. µ¼ÑÔ

1.1 Ê²Ã´ÊÇ .NET£¿

ºÜÄÑÓÃÒ»¾ä»°ËµÇå³þ¡£°´ÕÕ΢ÈíµÄ˵·¨£¬.NETÊÇÒ»¸ö¡°¸ïÃüÐÔµÄÐÂÆ½Ì¨£¬¹¹½¨ÓÚ¿ª·ÅµÄInternetЭÒéºÍ±ê×¼Ö®ÉÏ£¬²¢Ìṩ¹¤¾ßºÍ·þÎñ£¬´Ó¶ø¿ÉÒÔеķ½Ê½ÈںϼÆËãºÍͨѶ¡£¡±

¸üʵÔÚһЩµÄ¶¨ÒåÓ¦¸ÃÊÇÕâ¸öÑù×Ó£º.NETÊÇÒ»¸öÓÃÓÚ¿ª·¢ºÍÔËÐÐÈí¼þÓ¦ÓõÄл·¾³¡£ÌØÉ«ÓУº¿ª·¢»ùÓÚWebµÄ·þÎñ¸ü¼ÓÈÝÒ×£»¾ßÓзḻµÄ±ê×¼ÔËÐÐʱ·þÎñ£¬¿ÉÒÔ±»²»Í¬³ÌÐòÓïÑÔ±àдµÄ×é¼þËùʹÓ㻾ßÓпçÓïÑԺͿç»úÆ÷»¥²Ù×÷ÄÜÁ¦¡£

×¢Ò⣬µ±ÊõÓï¡°.NET¡±±»ÓÃÓÚ´ËFAQʱ£¬ËüָֻеÄ.NETÔËÐÐʱÒÔ¼°ÓëÖ®Ïà¹ØµÄ¼¼Êõ£¬ÓÐʱ³ÆÖ®Îª¡°.NET Framework¡±¡£ÕâÆªFAQ²»É漰΢ÈíÕýÍùÉÏÌù.NETÃûÍ·µÄÈÎºÎÆäËüÎ廨°ËÃŵÄÏÖÓеĺÍеIJúÆ·Óë¼¼Êõ£¨±È·½¡°SQL Server.NET¡±£©¡£

1.2 .NETÖ»ÊÊÓÃÓÚ¹¹½¨webÕ¾µãÂð£¿

·ÇÒ²¡£ÌÈÈôÄã±àдÈκÎWindowsÈí¼þ£¨Ê¹ÓÃATL/COM¡¢MFC¡¢VBÉõÖÁÊÇÔ­ÉúµÄWin32 API£©£¬.NET¿ÉÒÔΪÄãĿǰÐÐÊ·½Ê½Ìṩһ¸ö¿ÉÐеÄÌæ´ú·½°¸£¨»òÕß˵ÊÇÒ»ÖÖ¶îÍâµÄ°ì·¨£©¡£µ±È»ÁË£¬¼ÙÈçÄãÔÚ¿ª·¢WebÕ¾µãµÄ»°£¬.NETÓÐÐí¶à¿ÉÒÔ¹´ÆðÄãÐËȤµÄ¶«Î÷ ¡ª ²»µ¥µ¥ÊÇASP.NET¡£

1.3 .NETÊÇʲôʱºòÐû²¼µÄ£¿

±È¶û¡¤¸Ç´ÄÔÚ2000Äê6ÔÂ22ÈÕ¾ÙÐеġ°ÂÛ̳2000¡±ÉÏ·¢±íÁËÒ»¸öÑݽ²£¬Ãè»æÁË.NETÃÀ¾°¡£ÔÚ2000Äê7ÔÂÕÙ¿ªµÄÖ°Òµ¿ª·¢Õß´ó»áÆÚ¼ä£¬¾ÙÐÐÁËÐí¶à¹ØÓÚ.NET¼¼ÊõµÄ»áÒé¡£Óë»á´ú±íÃÇ»¹Áìµ½Á˰üº¬ÓÐ.NET framework/SDKºÍVisual Studio.NETÔ¤ÀÀ°æµÄ¹âÅÌ¡£

1.4 .NET µÚÒ»°æµÄ·¢²¼ÈÕÆÚÊÇ£¿

SDK 1.0ºÍÔËÐÐʱµÄ×îÖհ湫¿ª·¢ÐÐÓÚ̫ƽÑó±ê׼ʱ¼ä2002Äê1ÔÂ15ÈÕÏÂÎç6µã×óÓÒ£¬Óë´Ëͬʱ£¬Visual Studio.NET×îÖÕ°æÒ²ÏòMSDN¶©»§¿ªÊ¼·¢ÊÛ¡£

1.5 ÎÒ¿ÉÒÔʹÓÃʲôÑùµÄ¹¤¾ßÀ´¿ª·¢.NETÓ¦Óã¿

Óкܶà¿ÉÓù¤¾ß£¬ÏÂÃæÒÔ¼Û¸ñµÝÔö˳Ðò¼ÓÒÔÃèÊö£º

.NET Framework SDK£ºSDKÊÇÃâ·ÑµÄ£¬°üÀ¨C++¡¢C#ºÍVB.NETÃüÁîÐбàÒëÆ÷£¬ÒÔ¼°Ðí¶àÆäËü¸¨Öú¿ª·¢¹¤¾ß£¨Òë×¢£ºÓ¡ÏóÖв¢²»°üº¬C++ÃüÁîÐбàÒëÆ÷£©¡£

ASP.NET Web Matrix£ºÕâÊÇÒ»¸öÀ´×Ô΢ÈíµÄÃâ·ÑASP.NET¿ª·¢»·¾³¡£³ýÁËGUI¿ª·¢»·¾³Í⣬ÏÂÔØÎļþÖл¹°üÀ¨Ò»¸ö¼òµ¥µÄWeb·þÎñÆ÷£¬¿ÉÒÔÓÃÀ´´úÌæIIS×÷ΪASP.NETÓ¦ÓõÄËÞÖ÷£¨host£©¡£ÕâΪWindows XP¼ÒÍ¥°æÓû§´ò¿ªÁËASP.NET¿ª·¢Ö®ÃÅ ¡ª Õâ¸ö°æ±¾µÄWindows²»ÄÜÔËÐÐIIS¡£

΢ÈíVisual C# .NET±ê×¼°æ£ºÕâÊÇÒ»¸öÁ®¼ÛµÄ£¨´óÔ¼100ÃÀÔª×óÓÒ£©Visual Studio.NET°æ±¾£¬½öÏÞÓÚÒ»ÖÖÓïÑÔ£¬²¢ÇÒÖ»ÓÐÓÐÏÞµÄÏòµ¼Ö§³Ö£¬±È·½Ëµ£¬Ã»ÓÐÌṩ¶ÔÀà¿â»ò×Ô¶¨ÒåUI¿Ø¼þµÄÏòµ¼Ö§³Ö¡£Ëü¶ÔÓÚ³õѧÕßѧϰÊÇÓÐÓõ쬶ÔÓÚÓб¾ÊÂÔÚȱ·¦Ïòµ¼µÄÇé¿öϽøÐпª·¢µÄ»úÁé¹íÀ´Ëµ£¬Ò²ÊÇÓÐÒâÒåµÄ¡£³ýÁËC#°æ£¬»¹ÓÐVB.NETºÍC++°æ¡£

΢ÈíVisual Studio.NETרҵ°æ£º¼ÙÈçÄãÓÐÒ»¸öVisual Studio 6.0ÊÚȨ£¬Äã¾Í¿ÉÒÔ»ñµÃÉý¼¶°æ¡£ÔÚдÕâЩÎÄ×ÖµÄʱºò£¨2002Äê6Ô£©£¬Î¢ÈíÕýÔÚ¶ÔÉý¼¶°æÌṩ300ÃÀÔªµÄÓʼÄÕÛ¿Û£¬Òò´Ë£¬ÕâÊÇÒ»¸öÏ൱»®ËãµÄÂòÂô¡£Visual Studio.NET°üÀ¨Á˶ÔËùÓÐ΢ÈíÓïÑÔ£¨C#¡¢C++¡¢VB.NET£©µÄÖ§³Ö£¬Ëü»¹°üº¬¹ã·ºµÄÏòµ¼Ö§³Ö¡£

λÓÚ¡°¼Û¸ñ¹âÆ×¡±×î¸ß¶ËµÄÊÇVisual Studio.NETÆóÒµ°æºÍÆóÒµ¼Ü¹¹Ê¦°æ¡£ËüÃÇÌṩÁ˶îÍâµÄ¹¦ÄÜ£¬ÀýÈçVisual Sourcesafe£¨ÓÃÓÚ°æ±¾¿ØÖÆ£©ºÍÐÔÄÜÓë·ÖÎö¹¤¾ß¡£¿Éµ½Õâ¶ù²ì¿´Visual Studio.NET¹¦ÄܱȽϣºhttp://msdn.microsoft.com/vstudio/howtobuy/choosing.asp¡£

1.6 .NET FrameworkÔËÐÐÓÚºÎÖÖÆ½Ì¨Ö®ÉÏ£¿

ÔËÐÐʱ֧³ÖWindows XP¡¢Windows 2000¡¢NT4 SP6aºÍWindows ME/98£¬²»Ö§³ÖWindows 95¡£FrameworkµÄijЩ×é³É²¿·Ö£¬²¢²»ÊÇÔÚËùÓÐÆ½Ì¨É϶¼Äܹ¤×÷£¬±È·½Ëµ£¬ASP.NETÖ»ÄÜÔËÐÐÓÚWindows XPºÍWindows 2000ÉÏ£¬Windows 98/ME²»ÄÜÓÃ×÷¿ª·¢»·¾³¡£

Windows XP¼ÒÍ¥°æ²»Ö§³ÖIIS£¬Òò´ËËü²»ÄÜÓÃÀ´×÷ΪASP.NETµÄËÞÖ÷¡£²»¹ý£¬ASP.NET Web Matrix Web·þÎñÆ÷£¬¿ÉÒÔÔËÐÐÓÚXP¼ÒÍ¥°æÉÏ¡£

MonoÏîÄ¿ÊÔͼÔÚLinuxÉÏʵÏÖ.NET Framework¡£

1.7 .NET FrameworkÖ§³ÖÄÄЩÓïÑÔ£¿

΢ÈíÌṩÁËC#¡¢C++¡¢VBºÍJScript±àÒëÆ÷£¬ÆäËü³§ÉÌÒѾ­Ðû³ÆËüÃÇÓÐÒ⿪·¢Õë¶ÔCOBOL¡¢Eiffel¡¢Perl¡¢ Smalltalk ºÍ PythonµÈÓïÑÔµÄ.NET±àÒëÆ÷¡£

1.8 .NET Framework½«»á±ê×¼»¯Âð£¿

ÒÔÏÂÊÇÀ´×ÔÓÚhttp://msdn.microsoft.com/net/ecma/µÄÒ»¶Î»°£º¡°2001Äê12ÔÂ13ÈÕ£¬ECMA»áÔ±´ó»áÅú×¼C#ºÍͨÓÃÓïÑÔ»ù´¡ÉèÊ©£¨CLI£©¹æ·¶³ÉΪ¹ú¼Ê±ê×¼¡£ÔÚECMA±ê×¼ÖУ¬ËüÃǵÄÃû×Ö½«»áÊÇECMA-334 £¨C#£©ºÍECMA-335 £¨CLI£©¡£¡±

2. »ù±¾ÊõÓï

2.1 Ê²Ã´ÊÇCLR£¿

CLR = Common Language Runtime£¨Í¨ÓÃÓïÑÔÔËÐÐʱ£©¡£CLRÊÇÒ»Ì×±ê×¼×ÊÔ´£¬£¨ÀíÂÛÉÏ£©¿ÉÒÔ±»ÈκÎ.NET³ÌÐòËùÀûÓ㬶ø²»¹ÜʹÓÃÄÄÖÖ³ÌÐòÓïÑÔ¡£Robert Schmidt£¨Î¢Èí£©ÔÚËûµÄMSDN PDC#ÎÄÕÂÀÁоÙÁËÈçÏÂCLR×ÊÔ´£º

  • ÃæÏò¶ÔÏóµÄ±à³ÌÄ£ÐÍ£¨¼Ì³Ð¡¢¶à̬¡¢Òì³£´¦ÀíºÍÀ¬»øÊÕ¼¯µÈ£© 

  •  °²È«Ä£ÐÍ

  •  ÀàÐÍϵͳ

  •  ËùÓÐ.NET»ùÀà

  •  Ðí¶à.NET frameworkÀà

  • ¿ª·¢¡¢µ÷ÊÔºÍÆÀ²â£¨profiling£©¹¤¾ß

  •  Ö´ÐкʹúÂë¹ÜÀí

  •  ILµ½±¾µØ´úÂ루IL-to-native£©×ª»»Æ÷ºÍÓÅ»¯Æ÷

Õâ¶ÔÓÚ.NETÊÀ½çÀ´ËµÒâζ×Åʲô£¿²»Í¬³ÌÐòÓïÑÔµÄÄÜÁ¦½«±È¹ýÈ¥ÈκÎʱºò¸ü¼ÓÇ÷ͬ£¬¾¡¹ÜÏÔÈ»²¢·ÇËùÓÐÓïÑÔ¶¼ÄÜÖ§³ÖËùÓÐCLR·þÎñ¡£

2.2 Ê²Ã´ÊÇCTS£¿

CTS = Common Type System£¨Í¨ÓÃÀàÐÍϵͳ£©¡£ÕâÊÇ.NETÔËÐÐʱÄܹ»Àí½âµÄÒ»´óÌ×ÀàÐÍ£¬Òò´Ë£¬.NETÓ¦ÓóÌÐò¾Í¿ÉÒÔʹÓÃËüÃÇ¡£²»¹ýҪעÒ⣬²¢²»ÊÇËùÓÐ.NETÓïÑÔ¶¼Ö§³ÖCTSÖÐËùÓÐÀàÐ͵ġ£CTSÊÇCLSµÄÒ»¸ö³¬¼¯¡£

2.3 Ê²Ã´ÊÇCLS£¿

CLS = Common Language Specification£¨Í¨ÓÃÓïÑԹ淶£©¡£ËüÊÇCTSµÄÒ»¸ö×Ó¼¯£¬ËùÓÐ.NETÓïÑÔ¶¼½«Ö§³ÖËü¡£ÈκÎʹÓÃCLS¼æÈݵÄÀàÐ͵ijÌÐò£¬¶¼¿ÉÒÔºÍÒÔÈκÎÓïÑÔ±àдµÄ.NET³ÌÐò½øÐл¥²Ù×÷¡£

ÀíÂÛÉÏ£¬ÕâÔÊÐíÔÚ²»Í¬µÄ.NETÓïÑÔÖ®¼ä½øÐзdz£½ôÃܵػ¥²Ù×÷¡£±È·½Ëµ£¬ÔÊÐíÒ»¸öC#Àà´ÓÒ»¸öVBÀà¼Ì³ÐÏÂÀ´¡£

2.4 Ê²Ã´ÊÇIL£¿

IL = Intermediate Language£¨ÖмäÓïÑÔ£©¡£Ò²³ÆÎªMSIL£¨Microsoft Intermediate Language£¬Î¢ÈíÖмäÓïÑÔ£©»òCIL£¨Common Intermediate Language£¬Í¨ÓÃÖмäÓïÑÔ£©¡£ËùÓÐ.NETÔ´´úÂ루²»¹ÜÓÃÄÄÖÖÓïÑÔ±àд£©¶¼±»±àÒë³ÉIL¡£µ±Èí¼þ±»°²×°Ê±£¬ILת»»Îª»úÆ÷Â룬»òÔÚÔËÐÐʱ±»¼´Ê±£¨Just-In-Time£¬JIT£©±àÒëÆ÷Ëù´¦Àí¡£

2.5 Ê²Ã´ÊÇC#£¿

C#ÊÇ΢ÈíÉè¼ÆµÄÒ»ÃÅÐÂÓïÑÔ£¬ÓÃÓÚºÍ.NET frameworkЭ×÷¡£ÔÚËüµÄ°×ƤÊé¡¶C#½éÉÜ¡·£¨¡°Introduction to C#¡±£©ÖУ¬Î¢ÈíÊÇÕâôÃèÊöC#µÄ£º

¡°C#ÊÇÒ»ÃÅÅÉÉúÓÚCºÍC++µÄ¼òµ¥¡¢ÏÖ´ú¡¢ÃæÏò¶ÔÏóºÍÀàÐͰ²È«µÄ³ÌÐòÓïÑÔ¡£C#£¨·¢ÒôC sharp£©¼áʵµØÖ²ÉíÓÚCºÍC++ÓïÑÔ¼Ò×åÊ÷ÖУ¬²¢½«ºÜ¿ìΪCºÍC++³ÌÐòÔ±ËùÊìϤ¡£C#Ä¿±êÊǽ«Visual BasicµÄ¸ßÉú²úÁ¦ºÍC++µÄÔ­ÉúÍþÁ¦ÁªºÏÆðÀ´¡£¡±

°ÑÉÏÃæÒ»¶Î»°Öеġ°C#¡±Óá°Java¡±È¡¶ø´úÖ®£¬Äã»á·¢ÏÖÕâ¸ö˵·¨ÒÀȻͦºÃJ

¼ÙÈçÄãÊÇÒ»ÃûC++³ÌÐòÔ±£¬Äã¿ÉÄÜÀÖÒâ¿´¿´ÎÒµÄC# FAQ£¨Ó¢ÎÄ£ºhttp://www.andymcm.com/csharpfaq.htm£¬ÖÐÎÄ£ºhttp://www.royaloo.com/articles/articles_2002/CSharpFAQ.htm£©¡£

2.6 ÔÚ.NET»·¾³Ï£¬¡°Íйܣ¨managed£©¡±Ò»´ÊµÄº¬ÒåÊÇ£¿

ÊõÓï¡°Íйܣ¨managed£©¡±ÊÇÐí¶à»ìÂÒ²úÉúµÄÆðÒò£¬ÔÚ.NETÖУ¬Ëü±»ÓÃÓÚÐí¶à²»Í¬µÄµØ·½£¬Ëù±í´ïµÄ¶«Î÷ÓÐ×Åϸ΢µÄ²î±ð¡£

ÍйܴúÂ루Managed code£©£º.NET frameworΪÔËÐÐÔÚËüÀïÃæµÄ³ÌÐòÌṩÁËÊý¸öºËÐÄÔËÐÐʱ·þÎñ£¬ÀýÈçÒì³£´¦ÀíºÍ°²È«¡£ÎªÁËʹÕâЩ·þÎñÄܹ»ÔË×÷ÆðÀ´£¬´úÂë±ØÐëÏòÔËÐÐʱÌṩ×îÆðÂëµÄÐÅÏ¢£¬ÕâÑùµÄ´úÂë±»³ÆÎªÍйܴúÂ롣ĬÈÏÀ´Ëµ£¬ËùÓÐC#ºÍVisual Basic.NET´úÂë¶¼ÊÇÍйܵġ£VS7 C++´úÂëȱʡÀ´Ëµ²»ÊÇÍйܵ쬵«¿ÉÒÔͨ¹ýÖ¸¶¨ÃüÁîÐпª¹Ø£¨/com+£©£¬Ê¹±àÒëÆ÷Éú³ÉÍйܴúÂë¡£

ÍйÜÊý¾Ý£¨Managed data£©£ºÕâЩÊý¾ÝÓÉ.NETÔËÐÐʱÀ¬»øÊÕ¼¯Æ÷½øÐÐÅäÖúÍÇå³ý¡£C#ºÍVB.NETÊý¾Ý×ÜÊÇÍйܵģ¬Ä¬ÈÏÀ´Ëµ£¬VS7 C++Êý¾ÝÊÇ·ÇÍйܵ쬼´Ê¹Ê¹ÓÃ/com+¿ª¹ØÒ²ÊÇÈç´Ë£¬µ«¿ÉÒÔÓÃ__gc¹Ø¼ü×Ö½«Æä±ê¼ÇΪÍйܵġ£

ÍйÜÀࣨManaged classes£©£ºÍ¨³£ÔÚC++ÍйÜÀ©Õ¹£¨Managed Extensions for C++£©±³¾°ÏÂ̸¼°Õâ¸öÊõÓï¡£µ±Ê¹ÓÃME C++ʱ£¬Àà±ð¿É±êÒÔ__gc¹Ø¼ü×Ö¡£ÕýÈçÃû×ÖËù°µÊ¾µÄ£¬ÕâÒâζ×ÅÕâ¸öÀàµÄʵÌåËùÕ¼ÓõÄÄÚ´æÓÉÀ¬»øÊÕ¼¯Æ÷Íйܣ¬µ«Òâ˼»¹²»½öÓÚ´Ë¡£Õâ¸öÀà±ä³ÉÁËÒ»¸öÍêÈ«½»¸¶¸ø.NET´ó¼ÒÍ¥µÄ³ÉÔ±£¬Ëü¿ÉÏíÊÜ.NETËù´øÀ´µÄºÃ´¦£¬Í¬Ê±Ò²ÊÜ.NETÊ©¼ÓµÄÓйØÖÆÔ¼¡£¹ØÓںô¦µÄÒ»¸öÀý×ÓÊÇ¿ÉÒÔºÍÆäËüÓïÑÔ±àдµÄÀàºÜºÃµØ»¥²Ù×÷£¬ÀýÈ磬һ¸ömanaged C++Àà¿ÉÒԼ̳Ð×ÔÒ»¸öVBÀà¡£¹ØÓÚÔ¼ÊøµÄÒ»¸öÀý×ÓÊÇ£¬ÍйÜÀàÖ»Äܼ̳Ð×ÔÒ»¸ö»ùÀà¡£

2.7 Ê²Ã´ÊÇ·´É䣨reflection£©£¿

ËùÓÐ.NET±àÒëÆ÷¶¼ÎªËüÃÇÉú³ÉµÄÄ£¿é£¨modules£©ÖÐËù¶¨ÒåµÄÀàÐͲúÉúÔªÊý¾Ý£¨metadata£©£¬ÕâЩԪÊý¾ÝºÍÄ£¿é´ò°üÔÚÒ»Æð£¨Ä£¿é±»´ò°üÓÚÅä¼þ£¨assemblies£©Ö®ÖУ©£¬²¢¿Éͨ¹ý·´Éä»úÖÆ£¨reflection£©´æÈ¡¡£System.ReflectionÃû×Ö¿Õ¼äÖаüº¬µÄÀ࣬¿ÉÒÔÓÃÓÚ¡°²éѯ¡±Ä£¿é/Åä¼þµÄÀàÐÍ¡£

ʹÓ÷´ÉäÀ´´æÈ¡.NETÔªÊý¾Ý£¬·Ç³£ÀàËÆÓÚʹÓÃITypeLib/ITypeInfo´æÈ¡COMÖеÄÀàÐÍ¿âÊý¾Ý£¬²¢ÇÒ£¬Ëü±»ÓÃÓÚÀàËÆµÄÓÃ;£¬±È·½Ëµ£¬¾ö¶¨Êý¾ÝÀàÐͳߴ磬ÒÔÓÃÓÚ¿çÔ½ÉÏÏÂÎÄ/½ø³Ì/»úÆ÷±ß½çÁм¯£¨marshaling£©Êý¾Ý¡£

·´É仹¿ÉÒÔÓÃÓÚ¶¯Ì¬µ÷Ó÷½·¨£¨methods£©£¨²Î¼ûSystem.Type.InvokeMember£©£¬»òÔÚÔËÐÐʱ¿Ì¶¯Ì¬´´½¨ÀàÐÍ£¨²Î¼ûSystem.Reflection.Emit.TypeBuilder£©¡£

3. Åä¼þ£¨Assemblies£©

3.1 Ê²Ã´ÊÇÅä¼þ£¿

Åä¼þÓÐʱºò±»ÃèÊöΪһ¸öÂß¼­.EXE»ò.DLL£¬¿ÉÒÔÊÇÒ»¸öÓ¦Óã¨application£©£¨¾ßÓÐÒ»¸öÖ÷Èë¿Úµã£©£¬Ò²¿ÉÒÔÊÇÒ»¸ö¿â£¨library£©¡£Ò»¸öÅä¼þÓÉÒ»¸ö»ò¶à¸öÎļþ£¨dlls¡¢exesÒÔ¼°html ÎļþµÈ£©¹¹³É£¬´ú±íÒ»×é×ÊÔ´¡¢ÀàÐͶ¨ÒåÒÔ¼°¶ÔÕâЩÀàÐ͵ÄʵÏÖ¡£Ò»¸öÅä¼þ»¹¿ÉÒÔ°üº¬¶ÔÆäËüÅä¼þµÄÒýÓá£ÕâЩ×ÊÔ´¡¢ÀàÐͺÍÒýÓã¬ÃèÊöÓÚÒ»¸ö³ÆÎªÇåµ¥£¨manifest£©µÄÊý¾Ý¿éÖ®ÖС£Çåµ¥ÊÇÅä¼þµÄÒ»¸ö×é³É²¿·Ö£¬´Ó¶øÊ¹µÃÅä¼þ¾ßÓÐ×ÔÃèÊöÄÜÁ¦¡£

¹ØÓÚÅä¼þÒ»¸öÖØÒª·½ÃæÊÇ£¬ËüÃÇÊÇÀàÐÍÉí·Ý£¨identity£©µÄÒ»¸ö×é³É²¿·Ö¡£ÀàÐ͵ÄÉí·ÝÊÇÓÉÀàÐÍËù´¦µÄÅä¼þºÍÀàÐÍÃû×ÖÁªºÏ¶ø³É£¬ÕâÒâζ×Å£¬¼ÙÈçÅä¼þAµ¼³öÒ»¸ö½ÐTµÄÀàÐÍ£¬Åä¼þBÒ²µ¼³öÒ»¸ö½ÐTµÄÀàÐÍ£¬.NETÔËÐÐʱ»á½«ËüÃÇÊÓ×÷Á½¸öÍêÈ«²»Í¬µÄÀàÐÍ¡£´ËÍ⣬²»Òª°ÑÅä¼þºÍÃû×Ö¿Õ¼ä»ìΪһ̸¡£Ãû×ֿռ䲻¹ýÊÇÒ»ÖÖÓÃÀ´°´²ã´Î×éÖ¯ÀàÐÍÃû×ֵķ½Ê½£¬¶ÔÓÚÔËÐÐʱÀ´Ëµ£¬ÀàÐÍÃû×Ö¾ÍÊÇÀàÐÍÃû×Ö£¬²»¹ÜÓÃûÓÃÃû×Ö¿Õ¼äÀ´×éÖ¯Ãû×Ö¡£Åä¼þ¼ÓÉÏÀàÐÍÃû×Ö£¨²»¹ÜÕâ¸öÀàÐÍÃû×ÖÊÇ·ñÊôÓÚÒ»¸öÃû×ֿռ䣩£¬¿ÉÏòÔËÐÐʱ±ê¼ÇÒ»¸öΨһµÄÀàÐÍ¡£

¶Ô.NET°²È«À´Ëµ£¬Åä¼þÒ²·Ç³£ÖØÒª£¬Ðí¶à°²È«Ô¼Êø±»Ç¿¼ÓÓÚÅä¼þ±ß½ç¡£

×îºó£¬ÔÚ.NETÖУ¬Åä¼þÊǰ汾Эµ÷µÄµ¥Ôª¡£ÏÂÃæ¶Ô´ËÓиü¶àÃèÊö¡£

3.2 ÎÒÔõÑùÉú³ÉÒ»¸öÅä¼þ£¿

Éú³ÉÅä¼þ×î¼òµ¥µÄ°ì·¨ÊÇÖ±½ÓÀûÓÃ.NET±àÒëÆ÷¡£ÀýÈçÏÂÃæC#³ÌÐò£º

public class CTest

{

     public CTest()

     {

          System.Console.WriteLine( "Hello from CTest" );

     }

}

¿ÉÒÔÕâÑù½«Ëü±àÒë³ÉÒ»¸ö¿âÅä¼þ£¨library assembly£¬ dll£©£º

csc /t:library ctest.cs

È»ºó£¬¿ÉÒÔÔËÐС°IL·´»ã±àÆ÷£¨IL Disassembler£©¡±À´²é¿´Åä¼þÄÚÈÝ£¬Õâ¸ö¹¤¾ßÊǸúËæ.NET SDKÒ»Æð·Ö·¢µÄ¡£

ÄãÒ²¿ÉÒÔ½«Ô´´úÂë±àÒë³ÉÄ£¿é£¨modules£©£¬È»ºóʹÓÃÅä¼þÁ¬½ÓÆ÷£¨assembly linker£¬al.exe£©½«Ä£¿éÁ¬½á³ÉÒ»¸öÅä¼þ¡£¶ÔÓÚC#±àÒëÆ÷À´Ëµ£¬¿ÉÒÔʹÓÃ/target:module¿ª¹ØÉú³ÉÒ»¸öÄ£¿é£¬¶ø²»ÊÇÉú³ÉÒ»¸öÅä¼þ¡£

3.3 ˽ÓÐÅä¼þ£¨private assembly£©ºÍ¹²ÏíÅä¼þ£¨shared assembly£©Ö®¼äÓÐÊ²Ã´Çø±ð£¿

λÖúͿɼûÐÔ£ºÒ»¸ö˽ÓÐÅä¼þͨ³£Îªµ¥¸öÓ¦ÓÃËùʹÓ㬲¢ÇÒ´æ´¢ÓÚÕâ¸öÓ¦ÓÃËùÔÚµÄĿ¼֮ÖУ¬»ò´ËĿ¼ÏÂÃæµÄÒ»¸ö×ÓĿ¼ÖС£¹²ÏíÅä¼þͨ³£´æ´¢ÔÚÈ«¾ÖÅä¼þ»º´æ£¨global assembly cache£©Ö®ÖУ¬ÕâÊÇÒ»¸öÓÉ.NETÔËÐÐʱËùά»¤µÄÅä¼þ²Ö¿â¡£¹²ÏíÅä¼þͨ³£ÊǶÔÐí¶àÓ¦Óö¼ÓÐÓõĴúÂë¿â£¬±ÈÈç.NET frameworkÀà¡£ 

°æ±¾Ð­µ÷£ºÔËÐÐʱֻ¶Ô¹²ÏíÅä¼þÇ¿¼Ó°æ±¾Ô¼Êø£¬¶Ô˽ÓÐÅä¼þ²»Æð×÷Óá£

3.4 Åä¼þÊÇÈçºÎ±Ë´Ë·¢Ïֵģ¿

ͨ¹ýËÑË÷Ŀ¼·¾¶À´±Ë´Ë·¢ÏÖ¡£Óм¸¸öÒòËØ»áÓ°ÏìÕâ¸ö·¾¶£¨±ÈÈçÓ¦ÓÃÓòËÞÖ÷£¨AppDomain host£©ºÍÓ¦ÓÃÅäÖÃÎļþ£©¡£µ«¶ÔÓÚ˽ÓÐÅä¼þÀ´Ëµ£¬ËÑË÷·¾¶Í¨³£ÊÇÓ¦ÓÃËùÔÚĿ¼¼°Æä×ÓĿ¼£¬¶ø¶ÔÓÚ¹²ÏíÅä¼þÀ´Ëµ£¬ËÑË÷·¾¶Í¨³£ºÍ˽ÓÐÅä¼þ·¾¶Ò»Ñù£¬Íâ¼Ó¹²ÏíÅä¼þ»º´æ¡£

3.5 Åä¼þµÄ°æ±¾Ð­µ÷¹¤×÷»úÀíÊÇÔõÑùµÄ£¿

ÿһ¸öÅä¼þ¶¼ÓÐÒ»¸ö³ÆÎª¼æÈÝÐÔ°æ±¾µÄ°æ±¾ºÅ£¬²¢ÇÒ£¬¶ÔÒ»¸öÅä¼þµÄÿһ¸öÒýÓ㨴ÓÁíÍâÒ»¸öÅä¼þÖнøÐÐÒýÓã©£¬¼È°üÀ¨±»ÒýÓÃÅä¼þµÄÃû×Ö£¬Ò²°üÀ¨°æ±¾ºÅ¡£

°æ±¾ºÅÓÉËĸöÊý×Ö²¿·Ö×é³É£¨ÀýÈ磺5.5.2.33£©¡£Ç°Á½¸öÊý×ÖÖУ¬ÓÐÈÎÒâÒ»¸ö²»Ò»ÑùµÄÅä¼þ£¬Í¨³£¾Í±»¿´×÷ÊDz»¼æÈݵġ£¼ÙÈçǰÁ½¸öÏàͬ£¬µ«µÚÈý¸ö²»Í¬£¬Åä¼þ¾Í±»ÈÏΪ¡°¿ÉÄܼæÈÝ¡±¡£¼ÙÈçÖ»ÓеÚËĸöÊý×ÖÊDz»Ò»ÑùµÄ£¬Åä¼þ¾Í±»ÈÏΪÊǼæÈݵġ£²»¹ý£¬ÕâÖ»ÊÇĬÈϵÄÖ¸µ¼·½Õ룬Êǰ汾²ßÂÔ£¨version policy£©¾ö¶¨ÁËÕâЩ¹æÔòµÄÇ¿¼Ó·¶Î§¡£°æ±¾²ßÂԿɾ­ÓÉÓ¦ÓÃÅäÖÃÎļþÀ´Ö¸¶¨¡£

Çмǣº°æ±¾Ð­µ÷Ö»Õë¶Ô¹²ÏíÅä¼þ£¬¶Ô˽ÓÐÅä¼þ²»Æð×÷Óá£

4. Ó¦ÓÃÓò£¨Application Domains£©

4.1 Ê²Ã´ÊÇÓ¦ÓÃÓò£¿

¿É½«Ó¦ÓÃÓòÏëÏóΪÇáÁ¿¼¶½ø³Ì¡£¶à¸öÓ¦ÓÃÓò¿ÉÒÔ¹²´æÓÚÒ»¸öWin32½ø³ÌÖ®ÖС£Ó¦ÓÃÓòµÄÊ×ÒªÓÃ;ÊÇΪÁ˽«Ó¦ÓóÌÐò±Ë´Ë¸ôÀ뿪¡£

Win32½ø³Ìͨ¹ýÕ¼ÓнØÈ»²»Í¬µÄÄÚ´æµØÖ·¿Õ¼ä¶øÌṩ¸ôÀë»úÖÆ£¬ÕâÊǺܹÜÓõ쬵«Ëü´ú¼Û°º¹ó¶øÇÒÉìËõÐÔ²»ºÃ¡£.NETÔËÐÐʱͨ¹ý±£³Ö¶ÔÄÚ´æÊ¹ÓõĿØÖÆ£¬À´Ç¿ÖÆÖ´ÐÐÓ¦ÓÃÓò¸ôÀë¡£Ó¦ÓÃÓòÖеÄËùÓÐÄÚ´æ¶¼ÓÉ.NETÔËÐÐʱÀ´Íйܣ¬Òò´Ë£¬ÔËÐÐʱ¿ÉÒÔÈ·±£Ò»¸öÓ¦ÓÃÓòÀïµÄ¶«Î÷²»»á´æÈ¡±ðµÄÓ¦ÓÃÓòµÄÄÚ´æ¡£

4.2 Ó¦ÓÃÓòÊÇÔõô´´½¨³öÀ´µÄ£¿

Ó¦ÓÃÓòͨ³£ÓÉËÞÖ÷£¨hosts£©´´½¨¡£WindowsÍâ¿Ç£¨Windows Shell£©¡¢ASP.NETºÍIE¶¼ÊÇËÞÖ÷µÄÀý×Ó¡£µ±´ÓÃüÁîÐÐÔËÐÐ.NETÓ¦ÓÃʱ£¬ËÞÖ÷¾ÍÊÇÍâ¿Ç¡£Íâ¿ÇΪÿһ¸öÓ¦Óô´½¨Ò»¸öеÄÓ¦ÓÃÓò¡£

Ó¦ÓÃÓò»¹¿ÉÒÔÓÉ.NETÓ¦ÓÃÏÔʽ´´½¨¡£Õâ¶ùÓÐÒ»¸öC#Àý×Ó£¬Ëü´´½¨ÁËÒ»¸öAppDomain£¬ºóÕßÓÖ´´½¨ÁËÒ»¸ö¶ÔÏóÀàµÄʵÌ壬ȻºóÖ´ÐÐÕâ¸ö¶ÔÏóµÄÒ»¸ö·½·¨¡£×¢Ò⣬Äã±ØÐ뽫Õâ¶Î´úÂë²úÉúµÄ¿ÉÖ´ÐÐÎļþÃüÃûΪappdomaintest.exe£¬ÒÔʹÆäÄܹ»ÈçÆÚ¹¤×÷¡£

using System;

using System.Runtime.Remoting;

 

public class CAppDomainInfo : MarshalByRefObject

{

     public string GetAppDomainInfo()

     {

         return "AppDomain = " + AppDomain.CurrentDomain.FriendlyName;

     }

 

}

 

public class App

{

    public static int Main()

    {

          AppDomain ad = AppDomain.CreateDomain( "Andy's new domain", null, null );

          ObjectHandle oh = ad.CreateInstance( "appdomaintest", "CAppDomainInfo" );

          CAppDomainInfo adInfo = (CAppDomainInfo)(oh.Unwrap());

         string info = adInfo.GetAppDomainInfo();

        

          Console.WriteLine( "AppDomain info: " + info );

         return 0;

    }

}

4.3 ÎÒÄܱàд×Ô¼ºµÄ.NETËÞÖ÷£¨.NET host£©Âð£¿
¿ÉÒÔ¡£¹ØÓÚ×ö·¨µÄÀý×Ó£¬¿ÉÒԲο¼Jason WhittingtonºÍDon Box¿ª·¢µÄdm.net monikerµÄÔ´´úÂ루http://staff.develop.com/jasonw/clr/readme.htm£©¡£ÔÚ.NET SDKÖУ¬Ò²ÓÐÒ»¸ö½ÐCorHostµÄ´úÂëÀý×Ó¡£

5. À¬»øÊÕ¼¯£¨Garbage Collection£©

5.1 Ê²Ã´ÊÇÀ¬»øÊÕ¼¯£¿

À¬»øÊÕ¼¯ÊÇÒ»ÖÖÓÉÔËÐÐʱ×é¼þ¸ºÔð¹ÜÀí¶ÔÏóÉúÃüÆÚÒÔ¼°ËüÃÇËùÕ¼ÓõĶÑÄڴ棨heap memory£©µÄϵͳ¡£¶ÔÓÚ.NETÀ´Ëµ£¬Õâ²¢²»ÊÇʲôж«Î÷£¬JavaÒÔ¼°ºÜ¶àÆäËüÓïÑÔ/ÔËÐÐʱʹÓÃÀ¬»øÊÕ¼¯»úÖÆÒѾ­ÓÐÄÇôһ¶Îʱ¼äÁË¡£

5.2 µ±¶ÔÏó×îºóÒ»¸öÒýÓñ»½â³ýʱ£¬ËüÒ²²¢²»×ÜÊÇÁ¢¼´±»Ïú»Ù£¬ÕæµÄÂð£¿

û´í¡£¶ÔÓÚ¶ÔÏóµÄÏú»ÙÒÔ¼°ËüËùÕ¼ÓõÄÄÚ´æµÄ»ØÊÕʱ»ú£¬À¬»øÊÕ¼¯Æ÷ûÓÐÌṩÈκε£±£¡£

ÔÚµµ°¸¿âÀïÓÐÒ»¸öÓÐÒâ˼µÄÏßË÷£¬ÓÉChris Sells·¢Æð£¬ÊǹØÓÚC#ÖжÔÏóµÄ·ÇÈ·¶¨ÐÔÏú»ÙµÄ£º

http://discuss.develop.com/archives/wa.exe?A2=ind0007&L=DOTNET&P=R24819

2000Äêʮԣ¬Î¢ÈíBrian HarryͶµÝÁ˶ÔÕâ¸öÎÊÌâµÄ³¤Æª·ÖÎö£º

http://discuss.develop.com/archives/wa.exe?A2=ind0010A&L=DOTNET&P=R28572

¿ÉÔÚÕâ¶ù¿´µ½Chris Sells¶ÔBrianÌù×ÓµÄÓ¦´ð£º

http://discuss.develop.com/archives/wa.exe?A2=ind0010C&L=DOTNET&P=R983

5.3 Ϊʲô.NETÔËÐÐʱ²»Ìṩȷ¶¨ÐÔµÄÏú»Ù»úÖÆ£¿

ÕâÒª¹éÒòÓÚÀ¬»øÊÕ¼¯Ëã·¨¡£.NETÀ¬»øÊÕ¼¯Æ÷µÄ¹¤×÷»úÀíÊÇ£¬ÖÜÆÚÐԵرéÀú±»Ó¦Óõ±Ç°ÒýÓõÄËùÓжÔÏóµÄÁÐ±í¡£ÔÚÕâ¸öËÑË÷¹ý³ÌÖУ¬·²ÊÇûÓз¢ÏֵĶÔÏ󣬶¼½«×¼±¸ÓèÒÔÏú»Ù£¬ËüÃÇÕ¼ÓõÄÄÚ´æÒ²½«±»Êջء£ÕâÖÖËã·¨°µÊ¾µ±¶ÔÏóµÄ×îºóÒ»¸öÒýÓÃÒ²±»½â³ýʱ£¬ÔËÐÐʱ²¢²»»áÁ¢¼´½Óµ½Í¨Öª£¬Ö»ÓÐÏÂÒ»´Î¶Ô¶Ñ£¨heap£©½øÐÐÇåɨʱ£¬²ÅÄÜ·¢ÏÖÕâ¸öÇé¿ö¡£

½øÒ»²½¶øÑÔ£¬Ö´ÐÐÀ¬»øÊÕ¼¯Çåɨ´ÎÊýÔ½ÉÙ£¬ÕâÀàËã·¨¹¤×÷µÃÔ½ºÃ¡£Í¨³£À´Ëµ£¬¶ÑµÄºÄ¾¡ÊÇÊÕ¼¯ÇåɨµÄ´¥·¢Ìõ¼þ¡£

5.4 ȱ·¦È·¶¨ÐÔµÄÏú»Ù»úÖÆÔÚ.NETÖгɸöÎÊÌâÂð£¿

µ±È»ÊǸöÎÊÌ⣬ËüÓ°ÏìÁË×é¼þµÄÉè¼Æ¡£¼ÙÈçÄãµÄ¶ÔÏó³ÖÓдú¼Û°º¹ó»òϡȱµÄ×ÊÔ´£¨±ÈÈçÊý¾Ý¿âËø£©£¬ÄãÓ¦¸ÃÌṩijÖÖ°ì·¨£¬Ê¹µÃ¿Í»§³ÌÐò¿ÉÒÔÔÚÍêÊÂʱ£¬¸æËß¶ÔÏóÊͷŵôÕâЩ×ÊÔ´¡£Î¢Èí½¨ÒéÄãÌṩһ¸ö½ÐDispose()µÄ·½·¨À´´ïµ½Õâ¸öÄ¿µÄ¡£È»¶ø£¬¶ÔÓÚ·Ö²¼Ê½¶ÔÏóÀ´Ëµ£¬Õ⽫»áµ¼ÖÂÎÊÌâ¡£ÔÚÒ»¸ö·Ö²¼Ê½µÄϵͳÖУ¬Ë­À´µ÷ÓÃDispose()·½·¨£¿ÐèÒªÓÐijÖÖÐÎʽµÄÒýÓüÆÊý»úÖÆ»òËùÓÐȨ¹ÜÀí»úÖÆ£¬À´²Ù×Ý·Ö²¼Ê½¶ÔÏ󣬲»ÐÒµÄÊÇ£¬ÔËÐÐʱ¶Ô´ËûÓÐÌṩÈκΰïÖú¡£

5.5 ·ÇÈ·¶¨ÐÔÏú»Ù»úÖÆ¶Ô´ÓÍйܴúÂ루managed code£©ÖÐʹÓÃCOM¶ÔÏóÓÐÓ°ÏìÂð£¿

Êǵġ£µ±ÔÚÍйܴúÂëÖÐʹÓÃCOM¶ÔÏóʱ£¬Äã´ó´óÒÀÀµÓÚÀ¬»øÊÕ¼¯Æ÷À´µ÷ÓÃÖս᷽·¨£¬ÒÔÊÍ·ÅÄãµÄ¶ÔÏó¡£¼ÙÈçÄãµÄCOM¶ÔÏó³ÖÓÐÒ»¸ö´ú¼Û¸ß°ºµÄ×ÊÔ´£¬¶øËüÖ»ÄÜÔÚ×îÖÕÊÍ·ÅʱµÃÒÔÇå³ýµÄ»°£¬Äã¿ÉÄÜҪΪÄãµÄ¶ÔÏóÌṩһ¸öеĽӿڣ¬´Ó¶øÖ§³ÖÏÔʽµÄDispose()·½·¨¡£

5.6 ÎÒÌý˵Ӧ¸Ã±ÜÃâʹÓÃFinalize·½·¨£¬ÎÒÓ¦¸ÃÔÚÎÒµÄÀàÀïʵÏÖFinalize·½·¨Âð£¿

Ò»¸ö¾ßÓÐFinalize·½·¨µÄ¶ÔÏó±ÈûÓÐÕâ¸ö·½·¨µÄ¶ÔÏó¸üÊʺÏÓÚÀ¬»øÊÕ¼¯Æ÷¡£²»´æÔÚ¹ØÓÚ¶ÔÏóÖÕ½á˳ÐòµÄ±£Ö¤£¬Òò´Ë£¬´ÓFinalize·½·¨ÖÐÈ¥´æÈ¡±ðµÄ¶ÔÏóÊÇÓÐÎÊÌâµÄ¡£×îºó£¬²»´æÔÚ¶ÔÒ»¸ö¶ÔÏóµ÷ÓÃFinalize·½·¨µÄÈκε£±££¬Òò´Ë£¬ÓÀÔ¶¶¼²»Ó¦¸ÃÒÀÀµËüÀ´Çå³ý¶ÔÏóËùÕ¼ÓõÄ×ÊÔ´¡£

΢ÈíÍÆ¼öÈçϽâ¾öģʽ£º

public class CTest : IDisposable

{

     public void Dispose()

     {

         ... // Cleanup activities

          GC.SuppressFinalize(this);

     }

 

     ~CTest() // C# syntax hiding the Finalize() method

     {

          Dispose();

     }

}

ͨ³£Çé¿öÏ£¬¿Í»§µ÷ÓÃDispose()£¬¶ÔÏóµÄ×ÊÔ´µÃµ½ÁËÊÍ·Å£¬À¬»øÊÕ¼¯Æ÷ͨ¹ýµ÷ÓÃSuppressFinalize()£¬ÒÔÃâ³ýÂÄÐÐÖÕ½áÒåÎñ¡£ÔÚ×µÄÇé¿öÏ£¬Ò²¾ÍÊÇ˵£¬ÔÚ¿Í»§Íü¼Çµ÷ÓÃDispose()µÄÇé¿öÏ£¬¾ÍÓÐÒ»¸öºÏÇéºÏÀíµÄ»ú»á£¬Í¨¹ýÀ¬»øÊÕ¼¯Æ÷¶ÔFinalize()µÄµ÷Ó㬶ÔÏóµÄ×ÊÔ´½«×îÖյõ½ÊÍ·Å¡£¼øÓÚÀ¬»øÊÕ¼¯Ëã·¨µÄ¾ÖÏÞÐÔ£¬Õâ¿´ÆðÀ´ÏóÊÇÒ»¸öÏ൱ºÏÀíµÄ°ì·¨¡£

5.7 ÎÒÄܶÔÀ¬»øÊÕ¼¯Ëã·¨×÷Щ¿ØÖÆÂð£¿

Ò»µãµã¡£¾ÙÀýÀ´Ëµ£¬System.GCÀ౩¶ÁËÒ»¸öCollect·½·¨£¬ËüÇ¿ÆÈÀ¬»øÊÕ¼¯Æ÷Á¢¼´È¥ÊÕ¼¯ËùÓв»ÔÙ±»ÒýÓõĶÔÏó¡£

5.8 ÎÒÔõô²ÅÄÜ¿´³öÀ´À¬»øÊÕ¼¯Æ÷ÕýÔÚ¸ÉЩʲôÊ£¿


Ðí¶àÓÐÒâ˼µÄͳ¼Æ½á¹û¾­ÓÉ¡°.NET CLR xxx¡±ÐÔÄܼÆÊýÆ÷´Ó.NETÔËÐÐʱÊä³ö£¬¿ÉÒÔʹÓÃÐÔÄܼàÊÓÆ÷À´²é¿´ËüÃÇ¡£

6. ÐòÁл¯£¨Serialization£©

6.1 Ê²Ã´ÊÇÐòÁл¯£¿

ÐòÁл¯Êǽ«¶ÔÏóת»»Îª×Ö½ÚÁ÷µÄ¹ý³Ì¡£·´ÐòÁл¯ÊÇ´Ó×Ö½ÚÁ÷¹¹½¨¶ÔÏóµÄ·´Ïò¹ý³Ì¡£ÐòÁл¯/·´ÐòÁл¯Í¨³£ÓÃÓÚ¶ÔÏóµÄ´«Ê䣨±È·½Ëµ£¬ÔÚÔ¶³Ì»¯£¨remoting£©µÄ¹ý³ÌÖУ©£¬»òÕß½«¶ÔÏó³Ö¾Ã»¯£¨±È·½Ëµ£¬´æµ½ÎļþÖлòÊý¾Ý¿âÀ¡£

6.2 .NET Framework ¶ÔÐòÁл¯ÓÐÄÚ½¨Ö§³ÖÂð£¿

.NETÀà¿âÌṩÁËÁ½Àà¶ÀÁ¢µÄ»úÖÆ£ºXmlSerializerºÍSoapFormatter/BinaryFormatter¡£Î¢Èí½«XmlSerializer ÓÃÓÚ Web Services£¬¶ø½«SoapFormatter/BinaryFormatterÓÃÓÚÔ¶³Ì»¯¡£ÔÚÄã×Ô¼ºµÄ´úÂëÀÁ½¸öËæ±ãÄãÓá£

6.3 ÎÒÏëÐòÁл¯ÎÒµÄÀàµÄʵÌ壬ÎÒÓ¦¸ÃʹÓà XmlSerializer¡¢SoapFormatterºÍBinaryFormatterÖеÄÄÄÒ»ÖÖ£¿

ÒªÊÓ¾ßÌåÇé¿ö¶ø¶¨¡£XmlSerializerÓÐЩÑϸñµÄÏÞÖÆ£¬±È·½Ëµ£¬ÒªÇóÄ¿±êÀàÓÐÒ»¸öÎÞ²ÎÊýµÄ¹¹ÔìÆ÷£¬²¢ÇÒ£¬Ö»Óй«¿ªµÄ¶Á/дÊôÐÔºÍ×ֶβſɱ»ÐòÁл¯¡£²»¹ý£¬´ÓºÃµÄÒ»ÃæÀ´Ëµ£¬XmlSerializer¶Ô¶¨ÖÆXMLÎĵµÌṩÁËÁ¼ºÃÖ§³Ö¡£XmlSerializerµÄÌØÐÔÒâζ×Å£¬Ëü×îÊʺÏÓÚÓÃÔÚ¿çÆ½Ì¨µÄÇé¿öÏ£¬»òÕßÓÃÓÚ´ÓÏÖÓеÄXMLÎĵµ¹¹½¨¶ÔÏó¡£

SoapFormatterºÍBinaryFormatter±ÈXmlSerializerµÄÏÞÖÆÒªÉÙ£¬±ÈÈç˵£¬ËüÃÇ¿ÉÒÔÐòÁл¯Ë½ÓÐ×ֶΡ£È»¶ø£¬ËüÃǶ¼ÐèҪĿ±êÀà±êÒÔ[Serializable]ÌØÐÔ£¬Òò´Ë£¬ÏóXmlSerializerÒ»Ñù£¬ÐèҪСÐÄÒÔÐòÁл¯·½Ê½À´±àдÀà¡£ÓÐЩ¹îÒìµÄ¶«Î÷Ò²ÊÇҪСÐÄÌá·ÀµÄ£¬±È·½Ëµ£¬ÔÚ·´ÐòÁл¯Ê±£¬Ð¶ÔÏóµÄ¹¹ÔìÆ÷²¢²»±»µ÷Óá£

¶ÔSoapFormatterºÍBinaryFormatterµÄÑ¡Ôñ£¬È¡¾öÓÚÓ¦Óá£BinaryFormatter¶ÔÓÚÐòÁл¯ºÍ·´ÐòÁл¯¶¼ÊÇ·¢ÉúÔÚ.NETƽ̨Éϲ¢ÇÒÖ´ÐÐÐÔÄܺÜÖØÒªµÄÇé¿ö´óÓÐÓô¦¡£Í¨³£À´Ëµ£¬ÔÚËùÓÐÆäËüÇé¿öÏ£¬SoapFormatter¸üÓÐÒâÒ壬¼ÙÈçû³öʲô²í×ӵϰ£¬Ëü¸üÒ×ÓÚµ÷ÊÔ¡£

6.4 ÎÒÄܶ¨ÖÆÐòÁл¯¹ý³ÌÂð£¿

¿ÉÒÔ¡£XmlSerializerÖ§³ÖºÜ¶àÌØÐÔ£¨attributes£©£¬ËüÃÇ¿ÉÒÔÓÃÓÚÎªÌØ¶¨µÄÀàÉ趨ÐòÁл¯·½Ê½¡£ÀýÈ磬¿É½«Ä³¸ö×ֶλòÊôÐÔ±êÒÔ[XmlIgnore]ÌØÐÔ£¬´Ó¶ø½«ÆäÅųýÔÚÐòÁл¯»úÖÆÖ®Íâ¡£ÁíÍâÒ»¸öÀý×ÓÊÇ[XmlElement]ÌØÐÔ£¬Ëü¿ÉÓÃÓÚÖ¸¶¨XMLÔªËØÃû³Æ ¡ª Õâ¸öÔªËØÃû³Æ¿É±»ÓÃÓÚÌØ¶¨µÄÊôÐÔ»ò×ֶΡ£

¶ÔÓÚ¾­ÓÉSoapFormatter/BinaryFormatterµÄÐòÁл¯£¬Ò²¿ÉÒÔʹÓÃÌØÐÔ½øÐÐijÖ̶ֳȵĿØÖÆ¡£ÀýÈ磬[NonSerialized]ÌØÐԵȼÛÓÚXmlSerializerµÄ[XmlIgnore]ÌØÐÔ¡£¶ÔÐòÁл¯¹ý³ÌµÄÖÕ¼«¿ØÖÆ£¬¿ÉÒÔͨ¹ýÔÚÆäʵÌå´òËã±»ÐòÁл¯µÄÀàÉÏ£¬ÊµÏÖISerializable½Ó¿Ú¡£

6.5 ÎªÊ²Ã´XmlSerializerÕâôÂý£¿

XmlSerializerÓÐÒ»¸öonce-per-process-per-type¸ºµ£¡£Òò´Ë£¬µ±ÄãÔÚÓ¦ÓÃÖеÚÒ»´ÎÐòÁл¯»ò·´ÐòÁл¯Ò»¸ö¸ø¶¨ÀàÐ͵ĶÔÏóʱ£¬»á¸Ð¾õµ½Ã÷ÏÔµÄÑÓ³Ù¡£Í¨³£À´Ëµ£¬Õâ²»ÊǸöÎÊÌ⣬µ«Õâ»òÐíÒâζ¶ÔÓÚGUIÓ¦ÓÃÆô¶¯ÆÚ¼ä×°ÔØÅäÖÃÐÅÏ¢À´Ëµ£¬XmlSerializer²»ÊÇÒ»¸öºÃµÄÑ¡Ôñ¡£

6.6Ϊʲôµ±ÎÒÊÔͼÐòÁл¯Ò»¸öÉ¢ÁÐ±í£¨Hashtable£©Ê±±¨´í£¿

XmlSerializer²»ÄÜÓÃÓÚÐòÁл¯ÈκÎʵÏÖÁËIDictionary½Ó¿ÚµÄÀàµÄʵÌ壬±È·½ËµHashtable¡£µ«SoapFormatterºÍBinaryFormatterûÓÐÕâ¸öÏÞÖÆ¡£

6.7 XmlSerializerÅ׳öÁËÒ»¸öÒ»°ãÐԵĴíÎ󣺡°ÔÚ·´ÉäMyClassʱ³ö´í¡±£¬ÎÒÔõô²ÅÄܲéÃ÷³öÁËʲôÎÊÌ⣿

¿É²é¿´Å׳öÒì³£µÄInnerException ÊôÐÔ£¬ÒÔ»ñµÃ¸üÏ꾡µÄ³ö´íÏûÏ¢¡£

7. ÌØÐÔ£¨Attributes£©

7.1 Ê²Ã´ÊÇÌØÐÔ£¿

ÖÁÉÙÓÐÁ½Àà.NETÌØÐÔ¡£µÚÒ»ÀàÎÒ³ÆÖ®ÎªÔªÊý¾ÝÌØÐÔ£¨metadata attribute£©£¬ËüÔÊÐí½«Ò»Ð©Êý¾Ý¸½ÔÚÀà»ò·½·¨ÉÏ£¬ÕâЩÊý¾Ý³ÉΪÀàµÄÔªÊý¾ÝµÄÒ»²¿·Ö£¬²¢£¨ÏóÀàµÄÆäËüÔªÊý¾ÝÒ»Ñù£©¿ÉÒÔ·´É䣨reflection£©·½Ê½·ÃÎÊ¡£¹ØÓÚÔªÊý¾ÝÌØÐÔµÄÀý×ÓÖ®Ò»ÊÇ[serializable]£¬Ëü¿ÉÒÔ¸½¼ÓÔÚij¸öÀàÉÏ£¬±íʾÕâ¸öÀàµÄʵÌå¿É±»ÐòÁл¯¡£

[serializable] public class CTest {}

ÁíÍâÒ»ÀàÊÇÉÏÏÂÎÄÌØÐÔ£¨context attribute£©¡£ÉÏÏÂÎÄÌØÐÔºÍÔªÊý¾ÝÌØÐÔʹÓÃÀàËÆµÄÓï·¨£¬µ«ËüÃÇÖ®¼äÓÐןù±¾²»Í¬¡£ÉÏÏÂÎÄÌØÐÔÌṩÁËÒ»ÖÖ½ØÈ¡»úÖÆ£¬½å´Ë£¬ÊµÌ弤»îºÍ·½·¨µ÷ÓþͿɱ»ÔçһЩ»òÍíһЩ´¦Àí¡£¼ÙÈçÄã¶ÔKeith BrownµÄuniversal delegatorÓ¡ÏóÉî¿ÌµÄ»°£¬ÄãÓ¦¸Ã¶ÔÕâ¸ö˼Ïë¸Ðµ½ÊìϤ¡££¨Òë×¢£º¿É·ÃÎÊhttp://www.develop.com/kbrown/£¬ÒÔÁË½â¹ØÓÚuniversal delegator¸ü¶àÐÅÏ¢£©

7.2 ÎÒ¿ÉÒÔ´´½¨ÎÒ×Ô¼ºµÄÔªÊý¾ÝÌØÐÔ£¨metadata attributes£©Âð£¿

¿ÉÒÔ¡£Ö»Ðè´ÓSystem.AttributeÅÉÉúÒ»¸öÀàÏÂÀ´£¬²¢½«Æä±êÒÔAttributeUsageÌØÐÔ¼´¿É¡£ÀýÈ磺

[AttributeUsage(AttributeTargets.Class)]

public class InspiredByAttribute : System.Attribute

{

     public string InspiredBy;

    

     public InspiredByAttribute( string inspiredBy )

     {

          InspiredBy = inspiredBy;

     }

}  

 

[InspiredBy("Andy Mc's brilliant .NET FAQ")]

class CTest

{

}  

 

class CApp

{

     public static void Main()

     {       

          object[] atts = typeof(CTest).GetCustomAttributes(true);

 

          foreach( object att in atts )

              if( att is InspiredByAttribute )

                   Console.WriteLine( "Class CTest was inspired by {0}", ((InspiredByAttribute)att).InspiredBy  );

     }

}

7.3 ÎÒ¿ÉÒÔ´´½¨ÎÒ×Ô¼ºµÄÉÏÏÂÎÄÌØÐÔ£¨context attributes£©Âð£¿

¿ÉÒÔ¡£¿´¿´Don BoxµÄÀý×Ó£¨Ãû½ÐCallThreshold£©£º http://www.develop.com/dbox/dotnet/threshold/£¬ÒÔ¼°Peter Drayton µÄ Tracehook.NET£º http://www.razorsoft.net/¡£

8. ´úÂë·ÃÎʰ²È«£¨Code Access Security£©

8.1 Ê²Ã´ÊÇ´úÂë·ÃÎʰ²È«£¨CAS£©£¿

CASÊÇ.NET°²È«Ä£Ð͵ÄÒ»¸ö×é³É²¿·Ö£¬Ëü¾ö¶¨Ä³¶Î´úÂëÊÇ·ñÔÊÐíÖ´ÐУ¬ÒÔ¼°ËüÔÚÔËÐÐʱ¿ÉÒÔʹÓÃʲôÑùµÄ×ÊÔ´¡£ÀýÈ磬CAS¿ÉÒÔ·ÀÖ¹.NET WebС³ÌÐò£¨applet£©¸ñʽ»¯ÄãµÄÓ²ÅÌ¡£

8.2 CASµÄ¹¤×÷»úÀíÊÇÔõÑùµÄ£¿

CAS°²È«²ßÂÔ£¨policy£©Î§ÈÆÁ½¸ö¹Ø¼ü¸ÅÄ´úÂë×飨code groups£©ºÍȨÏÞ£¨permissions£©¡£Ã¿Ò»¸ö.NETÅä¼þ¶¼ÊÇÒ»¸öÌØ¶¨´úÂë×éµÄ³ÉÔ±£¬Ã¿Ò»¸ö´úÂë×é¶¼±»ÊÚÓèÔÚij¸öÃüÃûȨÏÞ¼¯£¨named permission set£©ÀïÉ趨µÄȨÏÞ¡£

ÀýÈ磬¼ÙÈçʹÓÃĬÈϵݲȫ²ßÂÔ£¬´Óij¸öWebÕ¾µãÉÏÏÂÔØµÄ¿Ø¼þÊôÓÚ¡°Zone ¨C Internet¡±´úÂë×飬Õâ¸ö´úÂë×é¾Í¾ßÓÐÓÉ¡°Internet¡±ÃüÃûȨÏÞ¼¯Ëù¶¨ÒåµÄȨÏÞ¡££¨×ÔÈ»¶øÈ»£¬¡°Internet¡±ÃüÃûȨÏÞ¼¯´ú±í×ÅÒ»¸ö·Ç³£ÓÐÏ޵ķ¶Î§µÄȨÏÞ£©

8.3 Ë­À´¶¨ÒåCAS´úÂë×飨code groups£©£¿

΢Èí¶¨ÒåÁËһЩĬÈϵĴúÂë×飬µ«Äã¿ÉÒÔÐÞ¸ÄËüÃÇ£¬ÉõÖÁ´´½¨Äã×Ô¼ºµÄ´úÂë×é¡£ÒªÏë¿´¿´»úÆ÷É϶¨ÒåµÄ´úÂë×飬¿ÉÒÔÃüÁîÐз½Ê½ÔËÐС°caspol -lg¡±¡£ÎÒ»úÆ÷ÉÏÊÇÕâÑùµÄ£º

Level = Machine

 

Code Groups:

 

1.  All code: Nothing

   1.1.  Zone - MyComputer: FullTrust

      1.1.1.  Honor SkipVerification requests: SkipVerification

   1.2.  Zone - Intranet: LocalIntranet

   1.3.  Zone - Internet: Internet

   1.4.  Zone - Untrusted: Nothing

   1.5.  Zone - Trusted: Internet

   1.6.  StrongName - 0024000004800000940000000602000000240000525341310004000003

000000CFCB3291AA715FE99D40D49040336F9056D7886FED46775BC7BB5430BA4444FEF8348EBD06

F962F39776AE4DC3B7B04A7FE6F49F25F740423EBF2C0B89698D8D08AC48D69CED0FC8F83B465E08

07AC11EC1DCC7D054E807A43336DDE408A5393A48556123272CEEEE72F1660B71927D38561AABF5C

AC1DF1734633C602F8F2D5: Everything

×¢Òâ´úÂë×éµÄ²ã´Î½á¹¹¡£×î¶¥²ãµÄÊÇ×îÒ»°ãµÄ£¨¡°All code¡±£©£¬È»ºó±»·Ö³É¼¸¸ö×Ó×飬ÿһ¸ö×Ó×黹¿ÉÒÔÔÙϸ·ÖÏÂÈ¥¡£»¹Òª×¢ÒâµÄÊÇ£¨ÕâÓеãÎ¥·´Ö±¾õ£©£¬×Ó×é¿ÉÒÔ¹ØÁªÓÐ±ÈÆä¸¸×é¸ü·ÅµÃ¿ªµÄȨÏÞ¼¯¡£

8.4 ÎÒÔõôÀ´¶¨ÒåÎÒ×Ô¼ºµÄ´úÂë×飿

ʹÓÃcaspol¡£ÀýÈ磬¼Ù¶¨ÄãÐÅÈÎÀ´×Ôwww.mydomain.comµÄ´úÂ룬²¢ÇÒ£¬ÄãÏ£ÍûËüÄܹ»ÍêÈ«·ÃÎÊÄãµÄ»úÆ÷£¬µ«ÄãÓÖÏ£Íû¶ÔËùÓÐÆäËüInternetÕ¾µã±£³ÖĬÈÏÏÞÖÆ£¬Äã¾Í¿ÉÒÔÔÚ¡°Zone - Internet¡±´úÂë×éÏ£¬¼ÓÈëÒ»¸öеÄ×Ó´úÂë×飬ÈçÏ£º

caspol -ag 1.3 -site www.mydomain.com FullTrust

ÏÖÔÚÔËÐÐcaspol ¨Clg£¬Ä㽫»á·¢ÏÖдúÂë×éÒѾ­±»×÷Ϊ×é1.3.1¶ø¼ÓÈ룺

...

   1.3.  Zone - Internet: Internet

      1.3.1.  Site - www.mydomain.com: FullTrust

...

×¢Ò⣬Êý×Ö±êÇ©£¨1.3.1£©Ö»ÊÇcaspol×Ô¼ºÉú³ÉµÄ¶«Î÷£¬Ä¿µÄÊÇΪÁËÒ×ÓÚÒÔÃüÁîÐз½Ê½²é¿´´úÂë×飬µ×²ãµÄÔËÐÐʱÓÀÔ¶¶¼¿´²»µ½ÕâЩ¶«Î÷¡£

8.5 ÎÒÔõô¸ü¸Ä´úÂë×éµÄȨÏÞ¼¯£¨permission set£©£¿

ʹÓÃcaspol¡£¼ÙÈçÄãÊÇ»úÆ÷µÄϵͳ¹ÜÀíÔ±µÄ»°£¬Äã¿ÉÒÔÔÚ¡°»úÆ÷¡±²ã½øÐвÙ×÷£¬ÕâÒâζ×ÅÄã×öµÄ¸ü¸Ä²»µ«»á³ÉΪÄÇ̨»úÆ÷µÄĬÈÏÉèÖ㬶øÇÒÓû§Ò²²»Äܹ»Ð޸ķŴóÕâЩȨÏÞ¡£¼ÙÈçÄãÊÇÒ»¸öÆÕͨÓû§£¨£¨²»ÊÇϵͳ¹ÜÀíÔ±£©£©£¬ÄãÈÔÈ»¿ÉÒÔÐÞ¸ÄȨÏÞ£¬µ«Ö»Äܽ«È¨ÏÞËõС¡£ÀýÈ磬ΪÁËÈÃIntranet´úÂëÄܹ»×öËüÏë×öµÄÊ£¬Äã¿ÉÒÔÕâô×ö¡£

caspol -cg 1.2 FullTrust

×¢Ò⣬ÒòΪÕâ±ÈĬÈϲßÂÔ£¨ÔÚÒ»¸ö±ê׼ϵͳ֮ÖУ©µÄȨÏÞÀ´µÃ´ó£¬ÄãÖ»ÄÜÔÚ»úÆ÷²ã×öÕâ¸öÐ޸ģ¬ÔÚÓû§²ã×öÕâÑùµÄÐÞ¸ÄûʲôЧ¹û¡£

8.6 ÎÒÄÜ´´½¨×Ô¼ºµÄȨÏÞ¼¯Âð£¿

¿ÉÒÔ¡£Ê¹ÓÃcaspol ¨Cap£¬¶¨ÒåÒ»¸öXMLÎļþ£¬Ëü°üº¬ÓÐȨÏÞ¼¯ÖÐËùÒª°üº¬µÄȨÏÞ¡£ÎªÁ˽ÚÊ¡ÄãÒ»µãʱ¼ä£¬Õâ¶ù£¨http://www.eponymous.eclipse.co.uk/samplepermset.xml£©ÓÐÒ»¸öÏàÓ¦ÓÚ¡°Everything¡±È¨ÏÞ¼¯µÄÑùÀýÎļþ£¬Äã¿ÉÒÔÐÞ¸ÄËüÒÔÂú×ãÄãµÄÐèÒª¡£¸ÄºÃÒԺ󣬿ÉÒÔÕâÑù½«Ëü¼ÓÈëµ½¿ÉÓõÄȨÏÞ¼¯Ö®ÖУº

caspol -ap samplepermset.xml

½ÓÏÂÀ´£¬ÎªÁ˽«Õâ¸öȨÏÞ¼¯Ê©¼ÓÓÚij¸ö´úÂë×éÉÏ£¬¿ÉÒÔÕâô×ö£º

caspol -cg 1.3 SamplePermSet

£¨Ä¬ÈÏÀ´Ëµ£¬1.3ÊÇ¡°Internet¡±´úÂë×飩

8.7 ÎÒÓöµ½ÁËһЩCASÂé·³£¬ÎÒÈçºÎ²ÅÄÜÕï¶ÏÊÇʲôµØ·½³öÁ˲î´í£¿

CaspolÓÐһЩѡÏî¿ÉÄÜ»áÅÉÉÏÓó¡¡£Ê×ÏÈ£¬Äã¿ÉÒÔʹÓÃcaspol ¨Crsg£¬½Ðcaspol¸æËßÄãÅä¼þËùÊôµÄ´úÂë×éÊÇʲô¡£Í¬ÑùµØ£¬ÄãÒ²¿ÉÒÔʹÓÃcaspol ¨Crsg£¬À´²éѯÊÇʲôÑùµÄȨÏÞÊ©¼ÓÓÚÖ¸¶¨µÄÅä¼þÖ®ÉÏÁË¡£

8.8 ÎÒ¶ÔËùÓÐÕâЩCASÍæÒⷳ͸ÁË£¬ÎÒÄܽûÓÃËüÂð£¿

¿ÉÒÔ£¬Ö»ÒªÄãÊÇÒ»Ãûϵͳ¹ÜÀíÔ±µÄ»°¡£ÔËÐÐcaspol -s off ¼´¿É¡£

9. ÖмäÓïÑÔ£¨Intermediate Language£¬IL£©

9.1 ÎÒÄܲ쿴Åä¼þµÄILÂð£¿

¿ÉÒÔ¡£Î¢ÈíÌṩÁËÒ»¸ö½Ð×÷IldasmµÄ¹¤¾ß£¬¿ÉÒÔÓÃÓڲ鿴Åä¼þµÄILºÍÔªÊý¾Ý¡£

9.2ÄÜ´ÓIL¡°·´Ïò¹¤³Ì¡±£¨reverse-engineered£©³öÔ´´úÂëÀ´Âð£¿

¿ÉÒÔ¡£Í¨³£À´Ëµ£¬´ÓILÖØÐÂÉú³É¸ß¼¶Ô´Â루±ÈÈçC#£©ÊÇÏ൱ÈÝÒ׵ġ£

9.3 ÎÒÔõô²ÅÄÜ·ÀÖ¹ÎҵĴúÂë±»´ÓIL¡°·´Ïò¹¤³Ì¡±³öÀ´£¿

Ŀǰ»¹Ã»ÓÐʲô¼òµ¥µÄ°ì·¨À´×èÖ¹´ÓIL¡°·´Ïò¹¤³Ì¡±³ö´úÂë¡£½«À´»òÐí¿ÉÒÔÀûÓÃһЩIL»ìÏý¹¤¾ß£¨IL obfuscation tools£©£¬ËüÃÇ¿ÉÄÜÀ´×Ô΢Èí£¬Ò²¿ÉÄÜÀ´×ÔµÚÈý·½³§ÉÌ¡£ÕâЩ¹¤¾ßͨ¹ý¶ÔIL½øÐÐÌØÊâ´¦Àí£¬Ê¹µÃ¡°·´Ïò¹¤³Ì¡±±äµÃ´ó´óÀ§ÄÑ¡£

µ±È»£¬¼ÙÈçÄã±àдweb servicesµÄ»°£¬¡°·´Ïò¹¤³Ì¡±¾Í²»ÊǸöÎÊÌâÁË£¬ÒòΪ¿Í»§ÎÞ·¨Ö±½Ó·ÃÎÊÄãµÄIL¡£

9.4 ÎÒ¿ÉÒÔÖ±½ÓÓÃIL±àд³ÌÐòÂð£¿

¿ÉÒÔ¡£Peter DraytonÏòDOTNETÓʼþÁбíÖÐͶµÝÁËÕâ¸ö¼òµ¥µÄÀý×Ó£º

.assembly MyAssembly {}

.class MyApp {

  .method static void Main() {

    .entrypoint

    ldstr      "Hello, IL!"

    call       void System.Console::WriteLine(class System.Object)

    ret

  }

}

½«Õâ¶Î´úÂ뿽±´µ½Ò»¸ö½Ðhello.ilµÄÎļþÖУ¬È»ºóÔËÐÐilasm hello.il£¬½«»áÉú³ÉÒ»¸öexeÐÎʽµÄÅä¼þ¡£

9.5 ÎÒÄÜÔÚILÖÐ×ö²»ÄÜÔÚC#ÖÐ×öµÄÊÂÇéÂð£¿

¿ÉÒÔ¡£¾ÙÁ½¸ö¼òµ¥µÄÀý×Ó£ºÔÚILÖУ¬Äã¿ÉÒÔÅ׳ö²»ÊÇ´ÓSystem.ExceptionÅÉÉú³öÀ´µÄÒì³££¬Ä㻹¿ÉÒÔʹÓÃϱ겻ÊÇ´Ó0¿ªÊ¼µÄÊý×é¡£

10. ¹ØÓÚCOMµÄÒ»Ð©ÍÆÂÛ

10.1 COMÊÙÖÕÕýÇÞÁËÂð£¿

Õâ¸ö»°ÌâÕÐÖÂÁË´óÁ¿µÄÕùÂÛ£¬¼ÙÈçÄãÔĶÁÁËÓʼþÁÐ±íµµ°¸×ÊÁÏÄã¾ÍÖªµÀÁË¡£¿´¿´ÏÂÃæÕâÁ½ÌõÏßË÷£º

http://discuss.develop.com/archives/wa.exe?A2=ind0007&L=DOTNET&D=0&P=68241

http://discuss.develop.com/archives/wa.exe?A2=ind0007&L=DOTNET&P=R60761

ÎÒÊÇÕâô¿´µÄ£ºCOMÄÚÈݷḻ£¬¶ÔÓÚ²»Í¬µÄÈËËü´ú±í×Ų»Í¬µÄ¶«Î÷£¬µ«¶ÔÎÒ¶øÑÔ£¬COM´Ó¸ù±¾ÉÏÀ´Ëµ£¬ÊÇС¿é´úÂëÖ®¼äÈçºÎ±Ë´Ë·¢ÏÖ²¢Ï໥ͨѶµÄ»úÖÆ¡£COM¾«È·¹æ¶¨ÁËÈçºÎ¶¨Î»ºÍͨѶ¡£ÔÚÒ»¸ö´¿´âµÄ.NETÊÀ½çÀһÇÐÈ«ÓÉ.NET¶ÔÏ󹹳ɣ¬Ð¡¿é´úÂëÈÔÈ»ÐèÒª±Ë´Ë·¢Ïֺͽ»Á÷£¬µ«ËüÃDz¢·ÇʹÓÃCOMÊֶΡ£ËüÃÇʹÓÃÒ»ÖÖ´ÓijЩ·½ÃæÀ´ËµÀàËÆÓÚCOMµÄÄ£ÐÍ£¬±ÈÈçÒÔ±í¸ñÐÎʽͬ×é¼þÒ»Æð´ò°ü´æ´¢µÄÀàÐÍÐÅÏ¢£¬·Ç³£ÀàËÆÓÚºÍCOM×é¼þÒ»Æð´ò°ü´æ´¢µÄÀàÐÍ¿âÐÅÏ¢£¬µ«Ëü²¢·ÇCOM¡£

ÄÇô£¬ÕâÓÐʲôҪ½ôµÄÂð£¿ßí£¬ÎÒÕæµÄ²»¹ØÐÄ´ó¶àÊýCOM¶«Î÷½¥½¥ÀëÈ¥¡£ÎÒ²»»áÔÚÒâ²»ÐèÒªÅܵ½×¢²á±íÀïתһȦµÄ×é¼þ²éÕÒ·½Ê½£¬ÎÒÒ²²»ÔÚºõ²»Ê¹ÓÃIDLÀ´¶¨ÒåÎҵĽӿڡ£µ«ÊÇ£¬ÓÐÒ»¼þÊÂÇéÎÒ²»»á·ÅÆú£ºÎÒ²»Ï붪µô»ùÓڽӿڵĿª·¢Ë¼Ïë¡£ÔÚÎÒ¿´À´£¬COM×îΰ´óµÄÁ¦Á¿£¬¾ÍÊÇËü¶Ô½Ó¿ÚºÍʵÏÖÖ®¼ä½øÐзÖÀëµÄÖýÌú°ãµØ¼á³Ö¡£²»ÐÒµÄÊÇ£¬.NET framework¿´À´²¢Ã»ÓÐÈç´Ë¼á³Ö£¬ËüÈÃÄãÄܹ»×ö»ùÓڽӿڵĿª·¢£¬µ«Ëü²¢Î´¼á³Ö·ÇÕâÑù²»¿É¡£ÓÐÈË¿ÉÄÜ»áÕùÂÛ¶àÒ»ÖÖÑ¡Ôñ´ÓÀ´¶¼²»ÊÇÒ»¼þ»µÊ£¬»òÐíËûÃÇÊǶԵ쬵«ÎÒÎÞ·¨²»ÏëÏñÕâ¿ÉÄÜÊÇÒ»¸öÍ˲½¡£

10.2 DCOMËÀµôÁËÂð£¿

¶ÔÓÚ.NET¿ª·¢ÈËÔ±À´Ëµ£¬ËüÒѾ­±ôÁÙËÀÍöÁË¡£.NET Framework ÌṩÁËÒ»¸ö²»ÊÇ»ùÓÚDCOMµÄеÄÔ¶³Ì»¯Ä£ÐÍ£¬µ±È»ÁË£¬ÔÚ»¥²Ù×÷µÄÇéÐÎÏ£¬»¹»áÓõ½DCOMµÄ¡£

10.3 MTS/COM+ËÀµôÁËÂð£¿

²»È»¡£µÚÒ»°æµÄ.NETÌṩÁ˶ÔÏÖÓÐCOM+·þÎñµÄ·ÃÎÊ£¨Í¨¹ýÒ»¸ö»¥²Ù×÷²ã£©£¬¶ø²»ÊÇʹÓÃÒ»¸ö±¾µØ.NET·þÎñÀ´È¡´úËü¡£ÓÐһЩÎ廨°ËÃŵŤ¾ßºÍ¹¦ÄÜÒÔÊÔͼʹÕâÖÖ·ÃÎʾ¡¿ÉÄÜÉÙһЩ¿àÍ´¡£Ö°Òµ¿ª·¢ÈËÔ±´ó»áÉÏ·¢Ë͵Ä.NET SDK£¬°üÀ¨¶ÔCOM+ºËÐÄ·þÎñµÄ»¥²Ù×÷Ö§³Ö£¨±ÈÈçJIT¼¤»î¡¢ÊÂÎñµÈ£©£¬µ«ÉÐδÌṩ¶ÔijЩ¸ü¸ß²ã·þÎñ£¨ÀýÈçCOM+ʼþ¡¢¶ÓÁÐ×é¼þµÈ£©µÄÖ§³Ö¡£

Ëæ×Åʱ¼äµÄÍÆÒÆ£¬ÎÒÃÇÆÚÍû»¥²Ù×÷Äܹ»±äµÃ¸ü¼ÓÎ޷죬Õâ»òÐíÒâζ×ÅijЩ·þÎñ½«³ÉΪCLRµÄºËÐÄ×é³É²¿·Ö£¬²¢ÇÒ£¨»òÕߣ©ÕâÒâζ×ÅijЩ·þÎñ½«»áÒÔÍйܴúÂëÖØÐ´£¬ÒÔÔËÐÐÓÚCLRÖ®ÉÏ¡£

¹ØÓÚÕâ¸öÖ÷ÌâµÄ¸ü¶àÌÖÂÛ£¬¿ÉÒÔµ½µµ°¸ÖÐÐÄËÑË÷Joe LongµÄÌû×Ó¡£JoeÊÇ΢ÈíCOM+ÍŶÓÏîÄ¿¾­Àí¡£¿É´ÓÏÂÃæÕâÌõÏûÏ¢¿ªÊ¼£º

http://discuss.develop.com/archives/wa.exe?A2=ind0007&L=DOTNET&P=R68370¡£

10.4 ÎÒÄÜÔÚ.NET³ÌÐòÖÐʹÓÃCOM×é¼þÂð£¿

¿ÉÒÔ¡£ÔÚ.NETÔËÐÐʱÖУ¬¿ÉÒÔ¾­ÓÉÔËÐÐʱ¿Éµ÷Óðü×°Æ÷£¨Runtime Callable Wrapper£¬RCW£©À´·ÃÎÊCOM×é¼þ¡£Õâ¸ö°ü×°Æ÷½«COM×é¼þ±©Â¶µÄCOM½Ó¿Úת»»Îª.NET¼æÈݵĽӿڡ£¶ÔÓÚOLE×Ô¶¯»¯½Ó¿Ú¶øÑÔ£¬RCW¿ÉÒÔ´ÓÀàÐÍ¿â×Ô¶¯Éú³É¡£¶ÔÓÚ·ÇOLE×Ô¶¯»¯½Ó¿ÚÀ´Ëµ£¬¿ÉÄÜÐèÒª¿ª·¢Ò»¸ö¶¨ÖƵÄRCW£¬ÒÔ½«COM½Ó¿Ú±©Â¶µÄÀàÐÍÒÔÊÖ¹¤·½Ê½Ó³Éäµ½.NET¼æÈݵÄÀàÐÍ¡£

¶ÔÓÚÄÇЩÊìϤATLµÄ¿ª·¢ÈËÔ±À´Ëµ£¬Õâ¶ùÓÐÒ»¸ö¼òµ¥Àý×Ó¡£Ê×ÏÈ£¬´´½¨Ò»¸öʵÏÖÁËÈçÏÂIDLµÄATL×é¼þ£º

import "oaidl.idl";

import "ocidl.idl";  

[

     object,

     uuid(EA013F93-487A-4403-86EC-FD9FEE5E6206),

     helpstring("ICppName Interface"),

     pointer_default(unique),

     oleautomation

]

 

interface ICppName : IUnknown

{

     [helpstring("method SetName")] HRESULT SetName([in] BSTR name);

     [helpstring("method GetName")] HRESULT GetName([out,retval] BSTR *pName );

};

 

[

     uuid(F5E4C61D-D93A-4295-A4B4-2453D4A4484D),

     version(1.0),

     helpstring("cppcomserver 1.0 Type Library")

]  

library CPPCOMSERVERLib

{

     importlib("stdole32.tlb");

     importlib("stdole2.tlb");

     [

          uuid(600CE6D9-5ED7-4B4D-BB49-E8D5D5096F70), 

          helpstring("CppName Class")

     ]

     coclass CppName

     {

          [default] interface ICppName;

     };

};

Ò»µ©´´½¨ºÃ×é¼þ£¬ÄãÓ¦¸ÃÄܹ»µÃµ½Ò»¸öÀàÐͿ⣬¶ÔÕâ¸öÀàÐÍ¿âÔËÐÐTLBIMP¹¤¾ß£¬ÈçÏ£º

tlbimp cppcomserver.tlb

¼ÙÈç³É¹¦µÄ»°£¬Äã»á¿´µ½ÈçÏÂÏûÏ¢£º

Typelib imported successfully to CPPCOMSERVERLib.dll

ÏÖÔÚ£¬ÄãÐèÒªÒ»¸ö.NET¿Í»§³ÌÐò£¬ÈÃÎÒÃÇʹÓÃC#À´±àд¡£´´½¨Ò»¸ö°üº¬ÓÐÈçÏ´úÂëµÄ.csÎļþ£º

using System;

using CPPCOMSERVERLib;  

public class MainApp

{

     static public void Main()

     {

          CppName cppname = new CppName();

          cppname.SetName( "bob" );

          Console.WriteLine( "Name is " + cppname.GetName() );

     }

}

×¢Ò⣬ÎÒÃÇʹÓÃÀàÐÍ¿âµÄÃû×Ö×÷ΪÃû×ֿռ䣬²¢ÒÔCOMÀàµÄÃû×Ö×÷ΪÀàµÄÃû×Ö¡£×÷Ϊ´úÌæ£¬ÎÒÃÇÒ²¿ÉÒÔʹÓÃCPPCOMSERVERLib.CppName×÷ΪÀàµÄÃû×Ö£¬²¢ÇÒ²»Ê¹ÓÃusing CPPCOMSERVERLibÓï¾ä¡£

¿ÉÒÔÕâÑù±àÒëÕâЩC#´úÂ룺

csc /r:cppcomserverlib.dll csharpcomclient.cs

×¢Ò⣬±àÒëÆ÷±»¸æÖªÈ¥ÒýÓÃÎÒÃÇÏÈǰʹÓÃTLBIMP´ÓÀàÐÍ¿âÉú³ÉµÄDLL¡£

ÏÖÔÚÓ¦¸Ã¿ÉÒÔÔËÐÐcsharpcomclient.exe£¬²¢ÔÚ¿ØÖÆÌ¨Éϵõ½ÈçÏÂÊä³ö£º

Name is bob

10.5 ÎÒÄÜÔÚCOM³ÌÐòÖÐʹÓÃ.NET×é¼þÂð£¿

¿ÉÒÔ¡£ÔÚCOMÖУ¬¿ÉÒÔ¾­ÓÉCOM¿Éµ÷Óðü×°Æ÷£¨COM Callable Wrapper£¬CCW£©À´·ÃÎÊ.NET×é¼þ¡£ÕâÀàËÆÓÚRCW£¨²Î¼ûÉÏÒ»¸öÎÊÌ⣩£¬µ«×÷ÓÃÏà·´¡£ÔÙÒ»´Î£¬¼ÙÈç°ü×°Æ÷²»ÄÜÓÉ.NET¿ª·¢¹¤¾ß×Ô¶¯Éú³É£¬»òÕß×Ô¶¯µÄÉú³ÉÐÐΪ²»ÊÇÄãÏëÒªµÄ£¬ÄÇÄã×Ô¼º¿ÉÒÔ¶¨ÖÆÒ»¸öCCW¡£»¹ÓУ¬ÒªÏëÈÃCOMÄܹ»¡°¿´µ½¡±.NET×é¼þ£¬±ØÐ뽫.NET×é¼þ×¢²áµ½×¢²á±íÖС£

Õâ¶ùÓÐÒ»¸ö¼òµ¥µÄÀý×Ó¡£ÏÈ´´½¨Ò»¸öÃûΪtestcomserver.csµÄC#Îļþ£¬°ÑÏÂÃæ´úÂë·Å½øÈ¥£º         

using System;  

namespace AndyMc

{

     public class CSharpCOMServer

     {

         public CSharpCOMServer() {}

         public void SetName( string name ) { m_name = name; }

         public string GetName() { return m_name; } 

          private string m_name;

     }         

}

È»ºóÕâôÀ´±àÒëÕâ¸ö.csÎļþ£º

csc /target:library testcomserver.cs

ÄãÓ¦¸ÃÄܹ»µÃµ½Ò»¸ödll£¬¿ÉÒÔÕâÑù×¢²áËü£º

regasm testcomserver.dll /tlb:testcomserver.tlb /codebase

ÏÖÔÚ£¬ÐèÒª´´½¨Ò»¸ö¿Í»§³ÌÐòÀ´²âÊÔÄãµÄ.NET COM×é¼þ£¬VBScript¾Í¿ÉÒÔ¡£°ÑÏÂÃæ´úÂë·ÅÈëÒ»¸ö½Ðcomclient.vbsµÄÎļþÖУº

Dim dotNetObj

Set dotNetObj = CreateObject("AndyMc.CSharpCOMServer")

dotNetObj.SetName ("bob")

MsgBox "Name is " & dotNetObj.GetName()

È»ºó£¬ÕâôÀ´Ö´ÐÐÕâ¶Î½Å±¾£º

wscript comclient.vbs

ÄãÓ¦¸ÃÂíÉϾÍÄÜ¿´µ½Ò»¸öÏûÏ¢¿ò£¬ÉÏÃæÐ´×Å¡°Name is bob¡±¡£

Ò»¸öÌæ´ú°ì·¨ÊÇʹÓÃÓÉJason Whittington ºÍ Don Box¿ª·¢µÄdm.net moniker£¬¿ÉÒÔµ½Õâ¶ù¿´¿´£ºhttp://staff.develop.com/jasonw/clr/readme.htm

10.6 ÔÚ.NETÊÀ½çÀATL³ÉÁ˶àÓàµÄ¶«Î÷Âð£¿

û´í£¬¼ÙÈçÄãÔÚ±àдÔËÐÐÓÚ.NET frameworkÀïµÄÓ¦Óõϰ¡£µ±È»£¬Óкܶ࿪·¢ÈËÔ±¿ÉÄÜÏ£Íû¼ÌÐøÊ¹ÓÃATLÀ´±àдÔËÐÐÓÚframeworkÖ®ÍâµÄC++ COM×é¼þ£¬µ«ÊÇ£¬¼ÙÈçÄãÔÚframeworkÖ®Äڵϰ£¬Ä㽫¼¸ºõ¿ÉÒԿ϶¨ÏëʹÓÃC#¡£Ô­ÉúµÄC++£¨ATLµÄ»ù´¡£©ÔÚ.NETÊÀ½çÖв¢Ã»ÓÐÌ«¶àµÄλÖã¬ËüÌ«½Ó½üÓڵײ㲢ÇÒÌṩÁËÌ«¶àµÄµ¯ÐÔ£¬.NETÔËÐÐʱÄÑÒÔ¹ÜÖÆËü¡£

11. ÔÓÏî

11.1 .NET remoting£¨Ô¶³Ì»¯£©µÄ¹¤×÷»úÀíÊÇÔõÑùµÄ£¿

.NET remotingÉæ¼°ÑØ×ÅͨµÀ£¨channels£©·¢ËÍÏûÏ¢¡£ÓÐHTTPºÍTCPÁ½¸ö±ê׼ͨµÀ¡£TCPͨµÀÄ¿µÄ½ö½öÊÇΪÁËÓÃÓÚ¾ÖÓòÍø£¨LANs£©£¬¶øHTTPͨµÀ¼È¿ÉÒÔÓÃÓÚ¾ÖÓòÍø£¬Ò²¿ÉÒÔÓÃÓÚ¹ãÓòÍø£¨WANs£¬Internet£©¡£

ÌṩÁ˶àÖÖÏûÏ¢ÐòÁл¯¸ñʽ֧³Ö£¬ÀýÈçSOAP¸ñʽ£¨»ùÓÚXML£©ºÍ¶þ½øÖƸñʽ¡£Ä¬ÈÏÀ´Ëµ£¬HTTPͨµÀʹÓÃSOAP¸ñʽ£¨¾­ÓÉ.NETÔËÐÐʱÐòÁл¯SOAP¸ñʽÆ÷£¨Serialization SOAP Formatter£©£©£¬TCPͨµÀʹÓöþ½øÖÆ·½Ê½£¨¾­ÓÉ.NETÔËÐÐʱÐòÁл¯¶þ½øÖƸñʽÆ÷£¨Serialization Binary Formatter£©£©£¬ÆäʵÁ½ÖÖͨµÀ¶¼¿ÉÒÔʹÓÃÈÎÒ»ÖÖÐòÁл¯¸ñʽ¡£

ÓÐÈçÏÂһЩԶ³Ì´æÈ¡·ç¸ñ£º

SingleCall£ºÀ´×Ô¿