Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
´ÓÓÎÏ·½Å±¾ÓïÑÔ˵Æð£¬ÆÊÎöMono´î½¨µÄ½Å±¾»ù´¡
 
×÷Õߣº³Â¼Î¶° À´Ô´£ºInfoQ ·¢²¼ÓÚ£º2015-8-18
  5413  次浏览      27
 

ǰÑÔÔÚÈÕ³£µÄ¹¤×÷ÖУ¬ÎÒż¶ûÄÜÓöµ½ÕâÑùµÄÎÊÌ⣺¡°ÎªºÎÓÎÏ·½Å±¾ÔÚÏÖÔÚµÄÓÎÏ·¿ª·¢ÖбäµÃ²»¿É»òȱ£¿¡±¡£ÄÇôÕâÖÜÎÒ¾ÍдƪÎÄÕ´ÓÓÎÏ·½Å±¾ÁÄÆð£¬·ÖÎöÒ»ÏÂÓÎÏ·½Å±¾ÒòºÎ³öÏÖ£¬¶øMonoÓÖÄÜÌṩÔõÑùµÄ½Å±¾»ù´¡¡£×îºó»áͨ¹ýÄ£ÄâUnity3DÓÎÏ·ÒýÇæÖеĽű¾¹¦ÄÜ£¬½«MonoÔËÐÐʱǶÈëµ½Ò»¸ö·ÇÍйܣ¨C/C++£©³ÌÐòÖУ¬ÊµÏֽű¾ÓïÑԺ͡°ÒýÇæ¡±Ö®¼äµÄ·ÖÀë¡£

Why£¿´ÓΪºÎÐèÒªÓÎÏ·½Å±¾ËµÆðÊ×ÏÈÁÄÁÄΪºÎÏÖÔÚµÄÓÎÏ·¿ª·¢ÐèҪʹÓÃÓÎÏ·½Å±¾Õâ¸ö»°Ìâ¡£

ΪºÎÐèÒªÓнű¾ÏµÍ³ÄØ£¿½Å±¾ÏµÍ³ÓÖÊÇÒòºÎ¶ø³öÏÖµÄÄØ£¿ÆäʵÓÎÏ·½Å±¾²¢·ÇÒ»¸öеÄÃû´Ê»òÕß¼¼Êõ£¬ÔçÔÚ±©Ñ©µÄ¡¶Ä§ÊÞÊÀ½ç¡·¿ªÊ¼»ð±¬µÄÄê´ú£¬ÈËÃDZãÊìÖªÁËÒ»¸ö½Ð×öLuaµÄ½Å±¾ÓïÑÔ¡£¶øµ±Ê±ÆäʵÓкܶàÍøÓζ¼²»Ô¼¶øÍ¬µØÊ¹ÓÃÁËLua×÷Ϊ½Å±¾ÓïÑÔ£¬±ÈÈçÍøÒ׵Ĵó»°Î÷ÓÎϵÁС£µ«ÊÇÔÚµ¥»úÓÎÏ·Á÷ÐеÄÄê´ú£¬ÎÒÃÇÈ´ºÜÉÙÌý˵ÓÐʲôµ¥»úÓÎϷʹÓÃÁ˽ű¾¼¼Êõ¡£ÕâÓÖÊÇÎªÊ²Ã´ÄØ£¿ÒòΪµ±Ê±µÄÓ²¼þˮƽ²»¸ß£¬ËùÒÔÐèҪʹÓÃC/C++ÕâÑùµÄÓïÑÔ¾¡Á¿Ñ¹Õ¥Ó²¼þµÄÐÔÄÜ£¬Í¬Ê±£¬µ¥»úÓÎÏ·µÄ¸üл»´ú²¢²»ÈçÍøÓÎÄÇôѸËÙ£¬ËùÒÔ¿ª·¢Ê±¼ä¡¢°æ±¾µü´úËٶȲ¢·ÇÆä¿¼ÂǵĵÚÒ»ÒªËØ£¬Òò¶ø¿ÉÒÔʹÓÃC/C++ÕâÑù¿ª·¢Ð§Âʲ»¸ßµÄÓïÑÔÀ´¿ª·¢ÓÎÏ·¡£

µ«ÊÇËæ×Åʱ¼äµÄÍÆÒÆ£¬Ó²¼þˮƽÖðÄêÌáÉý£¬Ñ¹Õ¥Ó²¼þÐÔÄܵÄÐèÇóÒѾ­²»ÔÙÆÈÇС£Ïà·´£¬´ËÊ±ÍøÓεÄÐËÆðÈ´¶Ô¿ª·¢ËÙ¶È¡¢°æ±¾¸üµüÌá³öÁ˸ü¸ßµÄÒªÇó¡£ËùÒÔ¿ª·¢Ð§Âʲ¢²»¸ßЧ£¬ÇÒͶ×Ê¡¢¾Þ´ó·çÏպܸߵÄC/C++±ã²»ÔÙÊÊÓ¦Êг¡µÄÐèÇóÁË¡£¸ü¼ÓÏÖʵµÄÎÊÌâÊÇ£¬Ëæ×ÅJava¡¢.NetÉõÖÁÊÇJavaScriptµÈÓïÑÔµÄÁ÷ÐУ¬³ÌÐòÔ±¿ÉÒÔÑ¡ÔñµÄÓïÑÔÔ½À´Ô½¶à£¬Õâ¸ü¼Óµ¼ÖÂÁËÓÅÐãµÄC/C++³ÌÐòÔ±ËùÕ¼±ÈÀýÔ½À´Ô½Ð¡¡£¶øÍøÓÎÊг¡µÄ²»¶ÏÀ©´ó£¬¶ÔÈ˲ŵÄÐèÇóÒ²Ô½À´Ô½´ó£¬Õâ¾ÍÔì³ÉÁË´óÁ¿µÄÈ˲ſÕȱ£¬Ò²¾Í·´¹ýÀ´Ìá¸ßÁËʹÓÃC/C++¿ª·¢ÓÎÏ·µÄ³É±¾¡£¶øÓÉÓÚC/C++ÊÇÃÅÈëÃÅÈÝÒ×½ø½×ÄѵÄÓïÑÔ£¬Æä¸ß¼¶ÌØÐԺ͸߶ÈÁé»îÐÔ´øÀ´µÄ¸ß·çÏÕÒ²ÊÇÿ¸öÏîĿʹÓÃC/C++½øÐпª·¢Ê±Ëù²»µÃ²»¿¼ÂǵÄÎÊÌâ¡£

Ò»¸ö¿ÉÒÔ½â¾öÕâÖÖÀ§¾³µÄ¾Ù´ë±ãÊÇÔÚÓÎÏ·ÖÐʹÓýű¾¡£¿ÉÒÔ˵ÓÎÏ·½Å±¾µÄ³öÏÖ£¬²»½ö½â¾öÁËÓÉÓÚC/C++ÄÑÒÔ¾«Í¨¶ø´øÀ´µÄ¿ª·¢Ð§ÂÊÎÊÌ⣬¶øÇÒ»¹½µµÍÁËʹÓÃC/C++½øÐпª·¢µÄÏîÄ¿·çÏպͳɱ¾¡£´Ó´Ë£¬½Å±¾ÓëÓÎÏ·¿ª·¢ÏàµÃÒæÕ㬻¥Ïà´Ù½ø£¬Öð½¥³ÉΪÁËÓÎÏ·¿ª·¢Öв»¿É»òȱµÄÒ»¸ö²¿·Ö¡£

¶øµ½ÁËÈç½ñÊÖÓÎÐËÆðµÄÄê´ú£¬Êг¡µÄÐèÇó±äµÃ¸ü¼ÓÅÓ´óÇұ仯¸ü¼ÓƵ·±¡£Õâ¾Í¸ü¼ÓÐèÒªÓýű¾ÓïÑÔÀ´Ìá¸ßÏîÄ¿µÄ¿ª·¢Ð§ÂÊ¡¢½µµÍÏîÄ¿µÄ³É±¾¡£

¶ø×÷ΪÓÎÏ·½Å±¾£¬Ëü¾ßÌåµÄÓÅÊÆ¶¼°üÀ¨ÄÄÐ©ÄØ£¿

Ò×ÓÚѧϰ£¬´úÂë·½±ãά»¤¡£ÊʺϿìËÙ¿ª·¢¡£

¿ª·¢³É±¾µÍ¡£ÒòΪÒ×ÓÚѧϰ£¬ËùÒÔ¿ÉÒÔÆôÓÃÐÂÈË£¬Í¬Ê±¿ª·¢Ëٶȿ죬ÕâЩ¶¼ÊǽµµÍ³É±¾µÄ·½·¨¡£

Òò´Ë£¬°üÀ¨Unity3DÔÚÄÚµÄÖÚ¶àÓÎÏ·ÒýÇæ£¬¶¼ÌṩÁ˽ű¾½Ó¿Ú£¬Èÿª·¢ÕßÔÚ¿ª·¢ÏîĿʱÄܹ»°ÚÍÑC/C++£¨×¢£ºUnity3D±¾ÉíÊÇÓÃC/C++дµÄ£©µÄÊø¸¿£¬ÕâÆäʵÊDZäÏཱུµÍÁËÓÎÏ·¿ª·¢µÄÃż÷£¬ÎüÒýÁ˺ܶà¶ÀÁ¢¿ª·¢ÕߺÍÓÎÏ·ÖÆ×÷°®ºÃÕß¡£

What? MonoÌṩµÄ½Å±¾»úÖÆ

Ê×ÏÈÒ»¸öÎÊÌ⣺MonoÊÇʲô£¿

MonoÊÇÒ»¸öÓÉXamarin¹«Ë¾ÔÞÖúµÄ¿ªÔ´ÏîÄ¿¡£Ëü»ùÓÚͨÓÃÓïÑԼܹ¹£¨Common Language Infrastructure £¬ËõдΪCLI£©ºÍC#µÄECMA ±ê×¼£¨Ecma-335¡¢Ecam-334£©£¬ÌṩÁË΢ÈíµÄ.Net¿ò¼ÜµÄÁíÒ»ÖÖʵÏÖ¡£Óë΢ÈíµÄ.Net¿ò¼Ü²»Í¬µÄÊÇ£¬Mono¾ß±¸ÁË¿çÆ½Ì¨µÄÄÜÁ¦£¬Ò²¾ÍÊÇ˵Ëü²»½öÄÜÔËÐÐÔÚWindowsϵͳÉÏ£¬¶øÇÒ»¹¿ÉÒÔÔËÐÐÔÚMac OSX¡¢LinuxÉõÖÁÊÇһЩÓÎϷƽ̨ÉÏ¡£

ËùÒÔ°ÑMono×÷Ϊ¿çƽ̨µÄ·½°¸ÊÇÒ»¸ö²»´íµÄÑ¡Ôñ¡£µ«MonoÓÖÊÇÈçºÎÌṩÕâÖֽű¾¹¦ÄܵÄÄØ£¿

Èç¹ûÐèÒªÀûÓÃMonoΪӦÓÿª·¢Ìṩ½Å±¾¹¦ÄÜ£¬ÄÇôÆäÖÐÒ»¸öǰÌá¾ÍÊÇÐèÒª½«MonoµÄÔËÐÐʱǶÈëµ½Ó¦ÓÃÖУ¬ÒòΪֻÓÐÕâÑù²ÅÓпÉÄÜʹÍйܴúÂëºÍ½Å±¾Äܹ»ÔÚÔ­ÉúÓ¦ÓÃÖÐʹÓá£ÎÒÃÇ¿ÉÒÔ·¢ÏÖ£¬½«MonoÔËÐÐʱǶÈëÓ¦ÓÃÖÐÊǶàôµÄÖØÒª¡£µ«ÔÚÌÖÂÛÈçºÎ½«MonoÔËÐÐʱǶÈëÔ­ÉúÓ¦ÓÃÖÐȥ֮ǰ£¬ÎÒÃÇÊ×ÏÈÒª¸ãÇå³þMonoÊÇÈçºÎÌṩ½Å±¾¹¦Äܵģ¬ÒÔ¼°MonoÌṩµÄµ½µ×ÊÇÔõÑùµÄ½Å±¾»úÖÆ¡£

MonoºÍ½Å±¾

±¾Ð¡½Ú½«»áÌÖÂÛÈçºÎÀûÓÃMonoÀ´Ìá¸ßÎÒÃǵĿª·¢Ð§ÂÊÒÔ¼°ÍØÕ¹ÐÔ¶øÎÞÐ轫ÒѾ­Ð´ºÃµÄC/C++´úÂëÖØÐÂÓÃC#дһ±é£¬Ò²¾ÍÊÇMonoÊÇÈçºÎÌṩ½Å±¾¹¦Äܵġ£

ʹÓÃÒ»ÖÖ±à³ÌÓïÑÔ¿ª·¢ÓÎÏ·ÊDZȽϳ£¼ûµÄÒ»ÖÖÇé¿ö¡£Òò¶øÓÎÏ·¿ª·¢ÕßÍùÍùÐèÒªÔÚ¸ßЧÂʵĵͼ¶ÓïÑԺ͵ÍЧÂʵĸ߼¶ÓïÑÔÖ®¼ä¾ñÔñ¡£ÀýÈçÒ»¸öÓÃC/C++¿ª·¢µÄÓ¦ÓõĽṹÈçÏÂͼ£º

¿ÉÒÔ¿´µ½µÍ¼¶ÓïÑÔºÍÓ²¼þ´ò½»µÀµÄ·½Ê½¸ü¼ÓÖ±½Ó£¬ËùÒÔÆäЧÂʸü¸ß¡£

¿ÉÒÔ¿´µ½¸ß¼¶ÓïÑÔ²¢Ã»ÓкÍÓ²¼þÖ±½Ó´ò½»µÀ£¬ËùÒÔЧÂʽϵ͡£

Èç¹ûÒÔËÙ¶È×÷ΪºâÁ¿ÓïÑԵıê×¼£¬ÄÇôÓïÑԴӵͼ¶µ½¸ß¼¶µÄ´óÌåÅÅÃûÈçÏ£º

»ã±àÓïÑÔ£»

C/C++£¬±àÒëÐ;²Ì¬²»°²È«ÓïÑÔ£»

C#¡¢Java£¬±àÒëÐ;²Ì¬°²È«ÓïÑÔ£»

Python, Perl, JavaScript£¬½âÊÍÐͶ¯Ì¬°²È«ÓïÑÔ¡£

¿ª·¢ÕßÔÚÑ¡ÔñÊʺÏ×Ô¼ºµÄ¿ª·¢ÓïÑÔʱ£¬µÄÈ·ÃæÁÙןܶàÏÖʵµÄÎÊÌâ¡£

¸ß¼¶ÓïÑÔ¶Ô¿ª·¢Õß¶øÑÔЧÂʸü¸ß£¬Ò²¸ü¼ÓÈÝÒ×ÕÆÎÕ£¬µ«¸ß¼¶ÓïÑÔ²¢²»¾ß±¸µÍ¼¶ÓïÑÔµÄÄÇÖÖÔËÐÐËÙ¶È£¬ÉõÖÁ¶ÔÓ²¼þµÄÒªÇó¸ü¸ß£¬ÕâÔÚijÖ̶ֳÈÉϵÄÈ·Ò²¾ö¶¨ÁËÒ»¸öÏîÄ¿µ½µ×Êdzɹ¦»¹ÊÇʧ°Ü¡£

Òò´Ë£¬ÈçºÎƽºâÁ½Õߣ¬»òÕß˵ÈçºÎÈÚºÏÁ½ÕßµÄÓŵ㣬±ã±äµÃÊ®·ÖÖØÒªºÍÆÈÇС£½Å±¾»úÖÆ±ãÔÚ´ËʱӦÔ˶øÉú¡£ÓÎÏ·ÒýÇæÓɸ»Óо­ÑéµÄ¿ª·¢ÈËԱʹÓÃC/C++¿ª·¢£¬¶øÒ»Ð©¾ßÌåÏîÄ¿Öй¦ÄܵÄʵÏÖ£¬ÀýÈçUI¡¢½»»¥µÈµÈÔòʹÓø߼¶ÓïÑÔ¿ª·¢¡£

ͨ¹ýʹÓø߼¶½Å±¾ÓïÑÔ£¬¿ª·¢Õß±ãÈÚºÏÁ˵ͼ¶ÓïÑԺ͸߼¶ÓïÑÔµÄÓŵ㡣ͬʱÌá¸ßÁË¿ª·¢Ð§ÂÊ£¬ÈçͬµÚÒ»½ÚÖÐËù½²µÄ£¬ÒýÈë½Å±¾»úÖÆÖ®ºó¿ª·¢Ð§ÂÊÌáÉýÁË£¬¿ÉÒÔ¿ìËÙ¿ª·¢Ô­ÐÍ£¬¶ø²»±Ø°Ñ´óÁ¿µÄʱ¼äÀË·ÑÔÚC/C++ÉÏ¡£

½Å±¾ÓïÑÔͬʱÌṩÁ˰²È«µÄ¿ª·¢É³ºÐģʽ£¬Ò²¾ÍÊÇ˵¿ª·¢ÕßÎÞÐèµ£ÐÄC/C++ÒýÇæÖеľßÌåʵÏÖϸ½Ú£¬Ò²ÎÞÐè¹Ø×¢ÀýÈç×ÊÔ´¹ÜÀíºÍÄÚ´æ¹ÜÀíÕâЩÊÂÇéµÄϸ½Ú£¬ÕâÔںܴó³Ì¶ÈÉϼò»¯ÁËÓ¦ÓõĿª·¢Á÷³Ì¡£

¶øMonoÔòÌṩÁËÕâÖֽű¾»úÖÆÊµÏֵĿÉÄÜÐÔ¡£¼´ÔÊÐí¿ª·¢ÕßʹÓÃJIT±àÒëµÄ´úÂë×÷Ϊ½Å±¾ÓïÑÔΪËûÃǵÄÓ¦ÓÃÌá¹©ÍØÕ¹¡£

ĿǰºÜ¶à½Å±¾ÓïÑÔÇ÷ÏòÓÚÑ¡Ôñ½âÊÍÐÍÓïÑÔ£¬ÀýÈçcocos2d-jsʹÓõÄJavaScript£¬Òò´ËЧÂÊÎÞ·¨ÓëÔ­Éú´úÂëÏà±È¡£¶øMonoÔòÌṩÁËÒ»ÖÖ½«½Å±¾ÓïÑÔͨ¹ýJIT±àÒëΪԭÉú´úÂëµÄ·½Ê½£¬Ìá¸ßÁ˽ű¾ÓïÑÔµÄЧÂÊ¡£ÀýÈ磬MonoÌṩÁËÒ»¸öÔ­Éú´úÂëÉú³ÉÆ÷£¬¿ÉÒÔÌá¸ßÓ¦ÓõÄÔËÐÐЧÂÊ¡£ËüͬʱÌṩÁ˺ܶ෽±ãµÄµ÷ÓÃÔ­Éú´úÂëµÄ½Ó¿Ú¡£

ÔÚΪһ¸öÓ¦ÓÃÌṩ½Å±¾»úÖÆÊ±£¬ÍùÍùÐèÒªºÍµÍ¼¶ÓïÑÔ½»»¥¡£Õâ±ã²»µÃ²»Ìáµ½½«MonoµÄÔËÐÐʱǶÈëµ½Ó¦ÓÃÖеıØÒªÐÔÁË¡£ÄÇô½ÓÏÂÀ´£¬ÎÒ½«»áÌÖÂÛÒ»ÏÂÈçºÎ½«MonoÔËÐÐʱǶÈëµ½Ó¦ÓÃÖС£

MonoÔËÐÐʱµÄǶÈë

¼ÈÈ»ÎÒÃÇÃ÷È·ÁËMonoÔËÐÐʱǶÈëÓ¦ÓõÄÖØÒªÐÔ£¬ÄÇôÈçºÎ½«ËüǶÈëÓ¦ÓÃÖоͳÉΪÁËÏÂÒ»¸öÖµµÃÌÖÂ۵ϰÌâ¡£

Õâ¸öС½ÚÎÒ»áΪ´ó¼Ò·ÖÎöÒ»ÏÂMonoÔËÐÐʱ¾¿¾¹ÊÇÈçºÎ±»Ç¶Èëµ½Ó¦ÓÃÖеģ¬ÒÔ¼°ÈçºÎÔÚÔ­Éú´úÂëÖе÷ÓÃÍйܷ½·¨£¬ÒÔ¼°ÈçºÎÔÚÍйܴúÂëÖе÷ÓÃÔ­Éú·½·¨¡£¶øÖÚËùÖÜÖªµÄÒ»µãÊÇ£¬Unity3DÓÎÏ·ÒýÇæ±¾ÉíÊÇÓÃC/C++д³ÉµÄ£¬ËùÒÔ±¾½Ú¾ÍÒÔUnity3DÓÎÏ·ÒýÇæÎªÀý£¬¼ÙÉè´ËʱÎÒÃÇÒѾ­ÓÐÁËÒ»¸öÓÃC/C++дºÃµÄÓ¦Óã¨Unity3D£©¡£

½«MonoÔËÐÐʱǶÈëµ½Õâ¸öÓ¦ÓÃÖ®ºó£¬Ó¦ÓþͻñÈ¡ÁËÒ»¸öÍêÕûµÄÐéÄâ»úÔËÐл·¾³¡£¶øÕâÒ»²½ÐèÒª½«¡°libmono¡±ºÍÓ¦ÓÃÁ´½Ó£¬Á´½ÓÍê³Éºó£¬C++Ó¦ÓõĵØÖ·¿Õ¼ä¾Í»áÏñÏÂͼÕâÑù£º

¶øÔÚC/C++´úÂëÖУ¬ÎÒÃÇÐèÒª½«MonoÔËÐÐʱ³õʼ»¯£¬Ò»µ©MonoÔËÐÐʱ³õʼ»¯³É¹¦£¬ÄÇôÏÂÒ»²½×îÖØÒªµÄ¾ÍÊǽ«CIL/.Net´úÂë¼ÓÔØ½øÀ´¡£¼ÓÔØÖ®ºóµÄµØÖ·¿Õ¼ä½«»áÈçÏÂͼËùʾ£º

ÄÇЩC/C++´úÂ룬ÎÒÃÇͨ³£³ÆÖ®Îª·ÇÍйܴúÂ룬¶øÍ¨¹ýCIL±àÒëÆ÷Éú³ÉCIL´úÂëÎÒÃÇͨ³£³ÆÖ®ÎªÍйܴúÂë¡£

½«MonoÔËÐÐʱǶÈëÓ¦ÓÿÉÒÔ·ÖΪ3¸ö²½Ö裺

±àÒëC++³ÌÐòºÍÁ´½ÓMonoÔËÐÐʱ£»

³õʼ»¯MonoÔËÐÐʱ£»

C/C++ºÍC#/CILµÄ½»»¥¡£

ÏÂÃæÎÒÃÇÒ»²½Ò»²½µØ½øÐС£Ê×ÏÈÎÒÃÇÐèÒª½«C++³ÌÐò½øÐбàÒë²¢Á´½ÓMonoÔËÐÐʱ¡£´ËʱÎÒÃÇ»áÓõ½pkg-config¹¤¾ß¡£ÔÚMacÉÏʹÓÃhomebrew½øÐа²×°£¬ÔÚÖÕ¶ËÖÐÊäÈëÃüÁbrew install pkgconfig¡±¼´¿É¡£

´ýpkg-config°²×°Íê±ÏÖ®ºó£¬ÎÒÃÇн¨Ò»¸öC++Îļþ£¬ÃüÃûΪunity.cpp£¬×÷ΪԭÉú´úÂ벿·Ö¡£ÎÒÃÇÐèÒª½«Õâ¸öC++Îļþ½øÐбàÒ룬²¢ºÍMonoÔËÐÐʱÁ´½Ó¡£

ÔÚÖÕ¶ËÊäÈ룺

g++ unity.cpp  -framework CoreFoundation -lobjc -liconv `pkg-config --cflags --libs mono-2`

´Ëʱ£¬¾­¹ý±àÒëºÍÁ´½ÓÖ®ºó£¬unity.cppºÍMonoÔËÐÐʱ±»±àÒë³ÉÁË¿ÉÖ´ÐÐÎļþ¡£

µ½´Ë£¬ÎÒÃÇÐèÒª½«MonoµÄÔËÐÐʱ³õʼ»¯¡£ËùÒÔÔÙÖØÐ»ص½¸Õ¸Õн¨µÄunity.cppÎļþÖУ¬ÎÒÃÇÒªÔÚC++ÎļþÖÐÀ´½øÐÐÔËÐÐʱµÄ³õʼ»¯¹¤×÷£¬¼´µ÷ÓÃmono_jit_init·½·¨¡£´úÂëÈçÏ£º

#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/class.h>
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/mono-config.h>

MonoDomain* domain;

domain = mono_jit_init(managed_binary_path);

mono_jit_initÕâ¸ö·½·¨»á·µ»ØÒ»¸öMonoDomain£¬ÓÃÀ´×÷Ϊʢ·ÅÍйܴúÂëµÄÈÝÆ÷¡£ÆäÖеIJÎÊýmanaged_binary_path£¬¼´Ó¦ÓÃÔËÐÐÓòµÄÃû×Ö¡£³ýÁË·µ»ØMonoDomainÖ®Í⣬Õâ¸ö·½·¨»¹»á³õʼ»¯Ä¬ÈÏ¿ò¼Ü°æ±¾£¬¼´2.0»ò4.0£¬Õâ¸öÖ÷ÒªÓÉʹÓõÄMono°æ±¾¾ö¶¨¡£µ±È»£¬ÎÒÃÇÒ²¿ÉÒÔÊÖ¶¯Ö¸¶¨°æ±¾¡£Ö»ÐèÒªµ÷ÓÃÏÂÃæµÄ·½·¨¼´¿É£º

domain = mono_jit_init_version ("unity", ""v2.0.50727);

ÕâÑù¾Í»ñȡӦÓÃÓò¡ª¡ªdomain¡£µ«Êǵ±MonoÔËÐÐʱ±»Ç¶ÈëÒ»¸öÔ­ÉúÓ¦ÓÃʱ£¬ËüÏÔÈ»ÐèÒªÒ»ÖÖ·½·¨À´È·¶¨×Ô¼ºËùÐèÒªµÄÔËÐÐʱ³ÌÐò¼¯ÒÔ¼°ÅäÖÃÎļþ¡£Ä¬ÈÏÇé¿öÏÂËü»áʹÓÃϵͳÖж¨ÒåµÄλÖá£

Èçͼ£¬¿ÉÒÔ¿´µ½£¬ÔÚһ̨µçÄÔÉÏ¿ÉÒÔ´æÔںܶ಻ͬ°æ±¾µÄMono£¬Èç¹ûÎÒÃǵÄÓ¦ÓÃÐèÒªÌØ¶¨µÄÔËÐÐʱ£¬¾ÍÒ²ÐèÒªÖ¸¶¨Æä³ÌÐò¼¯ºÍÅäÖÃÎļþµÄλÖá£
ΪÁËÑ¡ÔñËùÐèMono°æ±¾£¬¿ÉÒÔʹÓÃmono_set_dirs·½·¨£º

mono_set_dirs("/Library/Frameworks/Mono.framework/Home/lib", "/Library/Frameworks/Mono.framework/Home/etc");

ÕâÑù£¬ÎÒÃǾÍÉèÖÃÁËMonoÔËÐÐʱµÄ³ÌÐò¼¯ºÍÅäÖÃÎļþ·¾¶¡£

µ±È»£¬MonoÔËÐÐʱÔÚÖ´ÐÐһЩ¾ßÌ幦ÄÜʱ£¬¿ÉÄÜ»¹ÐèÒªÒÀ¿¿¶îÍâµÄÅäÖÃÎļþÀ´½øÐС£ËùÒÔÎÒÃÇÓÐʱҲÐèҪΪMonoÔËÐÐʱ¼ÓÔØÕâЩÅäÖÃÎļþ£¬Í¨³£ÎÒÃÇʹÓÃmono_config_parse·½·¨À´¼ÓÔØÕâЩÅäÖÃÎļþ¡£

µ±mono_config_parseµÄ²ÎÊýΪNULLʱ£¬MonoÔËÐÐʱ½«¼ÓÔØMonoµÄÅäÖÃÎļþ¡£µ±È»×÷Ϊ¿ª·¢Õߣ¬ÎÒÃÇÒ²¿ÉÒÔ¼ÓÔØ×Ô¼ºµÄÅäÖÃÎļþ£¬Ö»ÐèÒª½«ÅäÖÃÎļþµÄÎļþÃû×÷Ϊmono_config_parse·½·¨µÄ²ÎÊý¼´¿É¡£

MonoÔËÐÐʱµÄ³õʼ»¯¹¤×÷µ½´ËÍê³É¡£½ÓÏÂÀ´ÐèÒª¼ÓÔØ³ÌÐò¼¯²¢ÇÒÔËÐÐËü¡£

ÕâÀïÐèÒªÓõ½MonoAssemblyºÍmono_domain_assembly_open·½·¨¡£

const char* managed_binary_path = "./ManagedLibrary.dll";
MonoAssembly *assembly;
assembly = mono_domain_assembly_open (domain, managed_binary_path);
if (!assembly)
error ();

ÉÏÃæµÄ´úÂë»á½«µ±Ç°Ä¿Â¼ÏµÄManagedLibrary.dllÎļþÖеÄÄÚÈݼÓÔØ½øÒѾ­´´½¨ºÃµÄdomainÖС£´ËʱÐèҪעÒâµÄÊÇMonoÔËÐÐʱ½ö½öÊǼÓÔØ´úÂë¶øÃ»ÓÐÁ¢¿ÌÖ´ÐÐÕâЩ´úÂë¡£

Èç¹ûÒªÖ´ÐÐÕâЩ´úÂ룬ÔòÐèÒªµ÷Óñ»¼ÓÔØµÄ³ÌÐò¼¯Öеķ½·¨¡£»òÕßµ±ÄãÓÐÒ»¸ö¾²Ì¬µÄÖ÷·½·¨Ê±£¨Ò²¾ÍÊdzÌÐòÈë¿Ú£©£¬¿ÉÒÔͨ¹ýmono_jit_exec·½·¨µ÷ÓÃÕâ¸ö¾²Ì¬Èë¿Ú¡£

ÏÂÃæÎÒ½«¾ÙÒ»¸ö½«MonoÔËÐÐʱǶÈëC/C++³ÌÐòµÄÀý×Ó£¬Õâ¸öÀý×ÓµÄÖ÷ÒªÁ÷³ÌÊǼÓÔØÒ»¸öÓÉC#Îļþ±àÒë³ÉµÄDLLÎļþ£¬Ö®ºóµ÷ÓÃÒ»¸öC#µÄ·½·¨Êä³öHello World¡£

Ê×ÏÈ£¬ÎÒÃÇÍê³ÉC#²¿·ÖµÄ´úÂë¡£

namespace ManagedLibrary
{
public static class MainTest
{
public static void Main()
{
System.Console.WriteLine("Hello World");
}
}
}

ÔÚÕâ¸öÎļþÖУ¬ÎÒÃÇʵÏÖÁËÊä³öHello WorldµÄ¹¦ÄÜ¡£Ö®ºóÎÒÃǽ«Ëü±àÒëΪDLLÎļþ¡£ÕâÀïÎÒÒ²Ö±½ÓʹÓÃÁËMonoµÄ±àÒëÆ÷¡ª¡ªmcs¡£ÔÚÖÕ¶ËÃüÁîÐÐʹÓÃmcs±àÒë¸ÃcsÎļþ¡£Í¬Ê±ÎªÁËÉú³ÉDLLÎļþ£¬»¹ÐèÒª¼ÓÉÏ-t:libraryÑ¡Ïî¡£

mcs ManagedLibrary.cs -t:library

ÕâÑù±ãµÃµ½ÁËcsÎļþ±àÒëÖ®ºóµÄDLLÎļþ£¬½Ð×öManagedLibrary.dll¡£

½ÓÏÂÀ´£¬Íê³ÉC++²¿·ÖµÄ´úÂ롣ǶÈëMonoµÄÔËÐÐʱ£¬Í¬Ê±¼ÓÔØ¸Õ¸ÕÉú³ÉManagedLibrary.dllÎļþ£¬²¢ÇÒÖ´ÐÐÆäÖеÄMain·½·¨Êä³öHello World¡£

#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/class.h>
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/mono-config.h>
MonoDomain *domain;
int main()
{
const char* managed_binary_path = "./ManagedLibrary.dll";
//»ñȡӦÓÃÓò
domain = mono_jit_init (managed_binary_path);
//monoÔËÐÐʱµÄÅäÖÃ
mono_set_dirs("/Library/Frameworks/Mono.framework/Home/lib", "/Library/Frameworks/Mono.framework/Home/etc");
mono_config_parse(NULL);
//¼ÓÔØ³ÌÐò¼¯ManagedLibrary.dll
MonoAssembly* assembly = mono_domain_assembly_open(domain, managed_binary_path);
MonoImage* image = mono_assembly_get_image(assembly);
//»ñÈ¡MonoClass
MonoClass* main_class = mono_class_from_name(image, "ManagedLibrary", "MainTest");
//»ñȡҪµ÷ÓõÄMonoMethodDesc
MonoMethodDesc* entry_point_method_desc = mono_method_desc_new("ManagedLibrary.MainTest:Main()", true);
MonoMethod* entry_point_method = mono_method_desc_search_in_class(entry_point_method_desc, main_class);
mono_method_desc_free(entry_point_method_desc);
//µ÷Ó÷½·¨
mono_runtime_invoke(entry_point_method, NULL, NULL, NULL);
//ÊÍ·ÅÓ¦ÓÃÓò
mono_jit_cleanup(domain);
return 0;
}

Ö®ºó±àÒëÔËÐУ¬¿ÉÒÔ¿´µ½ÆÁÄ»ÉÏÊä³öµÄHello World¡£

¼ÈȻҪÌṩ½Å±¾¹¦ÄÜ£¬½«MonoÔËÐÐʱǶÈëC/C++³ÌÐòÖ®ºó£¬Ö»ÔÚC/C++³ÌÐòÖе÷ÓÃC#Öж¨ÒåµÄ·½·¨ÏÔÈ»»¹ÊDz»¹»µÄ¡£½Å±¾»úÖÆµÄ×îÖÕÄ¿µÄ»¹ÊÇÏ£ÍûÄܹ»Ôڽű¾ÓïÑÔÖÐʹÓÃÔ­ÉúµÄ´úÂ룬ËùÒÔÏÂÃæÎÒ½«Õ¾ÔÚUnity3DÓÎÏ·ÒýÇæ¿ª·¢ÕߵĽǶȣ¬¼ÌÐøÌ½Ë÷Ò»ÏÂÈçºÎÔÚC#Îļþ£¨½Å±¾Îļþ£©Öе÷ÓÃC/C++³ÌÐòÖеĴúÂ루ÓÎÏ·ÒýÇæ£©¡£

How? ÈçºÎÄ£ÄâUnity3DÖеĽű¾»úÖÆ

Ê×ÏÈ£¬¼ÙÉèÎÒÃÇҪʵÏÖµÄÊÇUnity3DµÄ×é¼þϵͳ¡£ÎªÁË·½±ãÓÎÏ·¿ª·¢ÕßÄܹ»Ôڽű¾ÖÐʹÓÃ×é¼þ£¬Ê×ÏÈÐèÒªÔÚC#ÎļþÖж¨ÒåÒ»¸öComponentÀà¡£

//½Å±¾ÖеÄ×é¼þComponent
public class Component
{
public int ID { get; }
private IntPtr native_handle;
}

Óë´Ëͬʱ£¬ÔÚUnity3DÓÎÏ·ÒýÇæ£¨C/C++£©ÖУ¬Ôò±ØÈ»Óкͽű¾ÖеÄComponentÏà¶ÔÓ¦µÄ½á¹¹¡£

//ÓÎÏ·ÒýÇæÖеÄ×é¼þComponent
struct Component
{
int id;
}

ÍйܴúÂ루C#£©ÖеĽӿÚ

¿ÉÒÔ¿´µ½´Ëʱ×é¼þÀàComponentÖ»ÓÐÒ»¸öÊôÐÔ£¬¼´ID¡£ÎÒÃÇÔÙΪ×é¼þÀàÔö¼ÓÒ»¸öÊôÐÔ£¬Tag¡£

Ö®ºó£¬ÎªÁËʹÍйܴúÂëÄܹ»ºÍ·ÇÍйܴúÂë½»»¥£¬ÐèÒªÔÚC#ÎļþÖÐÒýÈëÃüÃû¿Õ¼äSystem.Runtime.CompilerServices£¬Í¬Ê±Ìṩһ¸öIntPtrÀàÐ͵ľä±úÒÔ±ãÓÚÍйܴúÂëºÍ·ÇÍйܴúÂëÖ®¼äÒýÓÃÊý¾Ý¡££¨IntPtrÀàÐͱ»Éè¼Æ³ÉÕûÊý£¬Æä´óСÊÊÓÃÓÚÌØ¶¨Æ½Ì¨¡£¼´ÊÇ˵£¬´ËÀàÐ͵ÄʵÀýÔÚ32λӲ¼þºÍ²Ù×÷ϵͳÖн«ÊÇ32룬ÔÚ64λӲ¼þºÍ²Ù×÷ϵͳÉϽ«ÊÇ64λ¡£IntPtr ¶ÔÏ󳣿ÉÓÃÓÚ±£³Ö¾ä±ú¡£ ÀýÈ磬IntPtrµÄʵÀý¹ã·ºµØÓÃÔÚ System.IO.FileStreamÀàÖУ¬ÒԱ㱣³ÖÎļþ¾ä±ú¡££©

×îºó£¬ÎÒÃǽ«Component¶ÔÏóµÄ¹¹½¨¹¤×÷ÓÉÍйܴúÂëC#ÒÆ½»¸ø·ÇÍйܴúÂëC/C++£¬ÕâÑùÓÎÏ·¿ª·¢ÕßÖ»ÐèҪרעÓÚÓÎÏ·½Å±¾¼´¿É£¬ÎÞÐè¹Ø×¢C/C++²ãÃæ¼´ÓÎÏ·ÒýÇæ²ãÃæµÄ¾ßÌåʵÏÖÂß¼­ÁË£¬ÎÒÔÚ´ËÌṩÁ½¸ö·½·¨¼´ÓÃÀ´´´½¨ComponentʵÀýµÄ·½·¨£ºGetComponents£¬ÒÔ¼°»ñÈ¡IDµÄget_id_Internal·½·¨¡£

ÕâÑùÔÚC#¶Ë£¬ÎÒÃǶ¨ÒåÁËÒ»¸öComponentÀ࣬Ö÷ҪĿµÄÊÇΪÓÎÏ·½Å±¾ÌṩÏàÓ¦µÄ½Ó¿Ú£¬¶ø·Ç¾ßÌåÂß¼­µÄʵÏÖ¡£ÏÂÃæ±ãÊÇÔÚC#´úÂëÖж¨ÒåµÄComponentÀà¡£

using System;
using System.Runtime.CompilerServices;
namespace ManagedLibrary
{
public class Component
{
//×Ö¶Î
private IntPtr native_handle = (IntPtr)0;
//·½·¨
[MethodImpl(MethodImplOptions.InternalCall)]
public extern static Component[] GetComponents();
[MethodImpl(MethodImplOptions.InternalCall)]
public extern static int get_id_Internal(IntPtr native_handle);
//ÊôÐÔ
public int ID
{
get
{
return get_id_Internal(this.native_handle);
}
}
public int Tag {
[MethodImpl(MethodImplOptions.InternalCall)]
get;
}
}
}

Ö®ºó£¬ÎÒÃÇ»¹ÐèÒª´´½¨Õâ¸öÀàµÄʵÀý²¢ÇÒ·ÃÎÊËüµÄÁ½¸öÊôÐÔ£¬ËùÒÔ»¹ÒªÔÙ¶¨ÒåÁíÒ»¸öÀàMain£¬À´Íê³ÉÕâÏ×÷¡£

MainµÄʵÏÖÈçÏ£º

// Main.cs
namespace ManagedLibrary
{
public static class Main
{
public static void TestComponent ()
{
Component[] components = Component.GetComponents();
foreach(Component com in components)
{
Console.WriteLine("component id is " + com.ID);
Console.WriteLine("component tag is " + com.Tag);
}
}
}
}

·ÇÍйܴúÂ루C/C++£©µÄÂß¼­ÊµÏÖ

Íê³ÉÁËC#²¿·ÖµÄ´úÂëÖ®ºó£¬ÎÒÃÇÐèÒª½«¾ßÌåµÄÂß¼­ÔÚ·ÇÍйܴúÂë¶ËʵÏÖ¡£¶øÎÒÉÏÎÄÖ®ËùÒÔÒªÔÚComponentÀàÖж¨ÒåÁ½¸öÊôÐÔ:IDºÍTag£¬ÊÇΪÁËʹÓÃÁ½ÖÖ²»Í¬µÄ·½Ê½·ÃÎÊÕâÁ½¸öÊôÐÔ£¬ÆäÖÐÖ®Ò»¾ÍÊÇÖ±½Ó½«¾ä±ú×÷Ϊ²ÎÊý´«Èëµ½C/C++ÖУ¬ÀýÈçÉÏÎÄÎÒÌṩµÄget_id_InternalÕâ¸ö·½·¨£¬ËüµÄ²ÎÊý±ãÊǾä±ú¡£µÚ¶þÖÖ·½·¨ÔòÊÇÔÚC/C++´úÂëÖÐͨ¹ýMonoÌṩµÄmono_field_get_value·½·¨Ö±½Ó»ñÈ¡¶ÔÓ¦µÄ×é¼þÀàÐ͵ÄʵÀý¡£

»ñÈ¡×é¼þComponentÀàÖеÄÊôÐÔÓÐÁ½ÖÖ²»Í¬µÄ·½·¨£º

//»ñÈ¡ÊôÐÔ
int ManagedLibrary_Component_get_id_Internal(const Component* component)
{
return component->id;
}

int ManagedLibrary_Component_get_tag(MonoObject* this_ptr)
{
Component* component;
mono_field_get_value(this_ptr, native_handle_field, reinterpret_cast<void*>(&Component));
return component->tag;
}

Ö®ºó£¬ÓÉÓÚÎÒÔÚC#´úÂëÖлù±¾Ö»Ìṩ½Ó¿Ú£¬¶ø²»Ìṩ¾ßÌåÂß¼­ÊµÏÖ¡£ËùÒÔ»¹ÐèÒªÔÚC/C++´úÂëÖÐʵÏÖ»ñÈ¡Component×é¼þµÄ¾ßÌåÂß¼­£¬Ö®ºóÔÙÒÔÔÚC/C++´úÂëÖд´½¨µÄʵÀýΪÑù±¾£¬µ÷ÓÃMonoÌṩµÄ·½·¨ÔÚÍйܻ·¾³Öд´½¨ÏàͬµÄÀàÐÍʵÀý²¢ÇÒ³õʼ»¯¡£

ÓÉÓÚC#ÖеÄGetComponents·½·¨·µ»ØµÄÊÇÒ»¸öÊý×飬ËùÒÔ¶ÔÓ¦µÄÐèҪʹÓÃMonoArray´ÓC/C++Öзµ»ØÒ»¸öÊý×é¡£C#´úÂëÖÐGetComponents·½·¨ÔÚC/C++ÖжÔÓ¦µÄ¾ßÌåÂß¼­ÈçÏ£º

MonoArray* ManagedLibrary_Component_GetComponents()
{
MonoArray* array = mono_array_new(domain, Component_class, num_Components);

for(uint32_t i = 0; i < num_Components; ++i)
{
MonoObject* obj = mono_object_new(domain, Component_class);
mono_runtime_object_init(obj);
void* native_handle_value = &Components[i];
mono_field_set_value(obj, native_handle_field, &native_handle_value);
mono_array_set(array, MonoObject*, i, obj);
}

return array;
}

ÆäÖÐnum_ComponentsÊÇuint32_tÀàÐ͵Ä×ֶΣ¬ÓÃÀ´±íʾÊý×éÖÐ×é¼þµÄÊýÁ¿£¬ÏÂÃæÎÒ»áΪËü¸³ÖµÎª5¡£Ö®ºóͨ¹ýMonoÌṩµÄmono_object_new·½·¨´´½¨MonoObjectµÄʵÀý¡£¶øÐèҪעÒâµÄÊÇ´úÂëÖеÄComponents[i]£¬Components±ãÊÇÔÚC/C++´úÂëÖд´½¨µÄComponentʵÀý£¬ÕâÀïÓÃÀ´¸øMonoObjectµÄʵÀý³õʼ»¯¸³Öµ¡£

´´½¨ComponentʵÀýµÄ¹ý³ÌÈçÏ£º

num_Components = 5;
Components = new Component[5];
for(uint32_t i = 0; i < num_Components; ++i)
{
Components[i].id = i;
Components[i].tag = i * 4;
}

C/C++´úÂëÖд´½¨µÄComponentµÄʵÀýµÄidΪi£¬tagΪi * 4¡£

×îºó½«C#ÖеĽӿںÍC/C++ÖеľßÌåʵÏÖ¹ØÁªÆðÀ´¡£¼´Í¨¹ýMonoµÄmono_add_internal_call·½·¨À´ÊµÏÖ£¬Ò²¼´ÔÚMonoµÄÔËÐÐʱÖÐ×¢²á¸Õ¸ÕÓÃC/C++ʵÏֵľßÌåÂß¼­£¬ÒԱ㽫ÍйܴúÂ루C#£©ºÍ·ÇÍйܴúÂ루C/C++£©°ó¶¨¡£

// get_id_Internal
mono_add_internal_call("ManagedLibrary.Component::get_id_Internal", reinterpret_cast<void*>(ManagedLibrary_Component_get_id_Internal));
//Tag get
mono_add_internal_call("ManagedLibrary.Component::get_Tag", reinterpret_cast<void*>(ManagedLibrary_Component_get_tag));
//GetComponents
mono_add_internal_call("ManagedLibrary.Component::GetComponents", reinterpret_cast<void*>(ManagedLibrary_Component_GetComponents));

ÕâÑù£¬±ãʹÓ÷ÇÍйܴúÂ루C/C++£©ÊµÏÖÁË»ñÈ¡×é¼þ¡¢´´½¨ºÍ³õʼ»¯×é¼þµÄ¾ßÌ幦ÄÜ£¬½ÓÏÂÀ´ÎªÁËÑéÖ¤ÊÇ·ñ³É¹¦µØÄ£ÄâÁ˽«MonoÔËÐÐʱǶÈë¡°Unity3DÓÎÏ·ÒýÇæ¡±ÖУ¬ÎÒÃÇÐèÒª±àÒë´úÂë²¢ÇҲ鿴Êä³öÊÇ·ñÕýÈ·¡£

Ê×ÏȽ«C#´úÂë±àÒëΪDLLÎļþ¡£ÔÚÖÕ¶ËÖ±½ÓʹÓÃMonoµÄmcs±àÒëÆ÷À´Íê³ÉÕâ¸ö¹¤×÷¡£

ÔËÐкóÉú³ÉÁËManagedLibrary.dllÎļþ¡£

Ö®ºó½«unity.cppºÍMonoÔËÐÐʱÁ´½Ó¡¢±àÒ룬»áÉú³ÉÒ»¸öa.outÎļþ£¨ÔÚMacÉÏ£©¡£Ö´ÐÐa.out£¬¿ÉÒÔ¿´µ½ÔÚÖÕ¶ËÉÏÊä³öÁË´´½¨µÄ×é¼þµÄIDºÍTagµÄÐÅÏ¢¡£

ºó¼Ç

ͨ¹ý±¾ÎÄ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÓÎÏ·½Å±¾ÓïÑÔ³öÏֵıØÈ»ÐÔ¡£Í¬Ê±Ò²Ó¦¸ÃÁ˽âUnity3DÊÇC/C++ʵÏֵ쬵«ÊÇËüͨ¹ýMonoÌṩÁËÒ»Ì׽ű¾»úÖÆ£¬ÔÚ·½±ãÓÎÏ·¿ª·¢Õß¿ìËÙ¿ª·¢ÓÎÏ·µÄͬʱҲ½µµÍÁËÓÎÏ·¿ª·¢µÄÃż÷¡£

   
5413 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ