- ÈÈÃÅÎÄÕ£º
- · C#Öо²Ì¬¹¹Ô캯ÊýµÄѧϰ
- · ÓÃC#ͨ¹ýDatabaseLinkÁ¬½ÓÔ¶³ÌOracleÊý¾Ý±íµÄ´íÎ󣬼°Æä±äͨ·½·¨
- · C#Êý¾Ý±¨±à³ÌÖ®²âÊÔ³ÌÐò
- · C#ѧϰʵÀý£½«±È½Ï¸´ÔӵĽṹÐòÁл¯µ½ÎļþÖÐ
- · C++³ÌÐòÔ±¿ìËÙѧϰC#---(Èý)Íê
- · ÊÕ¼¯ÕûÀí£ºC# .NET º¯ÊýÁбí
- · ×Ö·û´®±í´ïʽ¼ÆËãC#³ÌÐòÉè¼Æ
- · C#ÖÐÎÄ×Ö·û½ØÈ¡º¯Êý
- · Visual C#.Net ÍøÂç³ÌÐò¿ª·¢-Socketƪ
- · C££À´´´½¨ºÍ¶ÁÈ¡XMLÎĵµ
- · ¼òµ¥ÊµÓõÄDataSet¸üÐÂÊý¾Ý¿âµÄÀà+×ܽᣨc#£©
- · C#ѧϰ±Ê¼ÇÒ»££C££ÖеIJÎÊý´«µÝ
ÔÚ C# ÖÐͨ¹ý P/Invoke µ÷ÓÃWin32 DLL
ÎÒÔÚ×Ô¼º×î½üµÄ±à³ÌÖÐ×¢Òâµ½Ò»¸öÇ÷ÊÆ£¬ÕýÊÇÕâ¸öÇ÷ÊÆ²ÅÒý³ö±¾ÔµÄרÀ¸Ö÷Ìâ¡£×î½ü£¬ÎÒÔÚ»ùÓÚ Microsoft® .NET Framework µÄÓ¦ÓóÌÐòÖÐÍê³ÉÁË´óÁ¿µÄ Win32® Interop¡£ÎÒ²¢²»ÊÇҪ˵ÎÒµÄÓ¦ÓóÌÐò³äÂúÁË×Ô¶¨ÒåµÄ interop ´úÂ룬µ«ÓÐʱÎÒ»áÔÚ .NET Framework Àà¿âÖÐÅöµ½Ò»Ð©´ÎÒªµ«ÓÖ·±Ðõ¡¢²»³ä·ÖµÄÄÚÈÝ£¬Í¨¹ýµ÷Óøà Windows® API£¬¿ÉÒÔ¿ìËÙ¼õÉÙÕâÑùµÄÂé·³¡£
Òò´ËÎÒÈÏΪ£¬.NET Framework 1.0 »ò 1.1 °æÀà¿âÖдæÔÚÈκΠWindows ËùûÓеŦÄÜÏÞÖÆ¶¼²»×ãΪ¹Ö¡£±Ï¾¹£¬32 λµÄ Windows£¨²»¹ÜºÎÖÖ°æ±¾£©ÊÇÒ»¸ö³ÉÊìµÄ²Ù×÷ϵͳ£¬Îª¹ã´ó¿Í»§·þÎñÁËÊ®¶àÄê¡£Ïà±È֮ϣ¬.NET Framework È´ÊÇÒ»¸öÐÂÊÂÎï¡£
Ëæ×ÅÔ½À´Ô½¶àµÄ¿ª·¢ÈËÔ±½«Éú²úÓ¦ÓóÌÐòתµ½ÍйܴúÂ룬¿ª·¢ÈËÔ±¸üƵ·±µØÑо¿µ×²ã²Ù×÷ϵͳÒÔͼÕÒ³öһЩ¹Ø¼ü¹¦ÄÜÏԵúÜ×ÔÈ» ¡ª ÖÁÉÙĿǰÊÇÈç´Ë¡£
ÖµµÃÇìÐÒµÄÊÇ£¬¹«¹²ÓïÑÔÔËÐпâ (CLR) µÄ interop ¹¦ÄÜ£¨³ÆÎªÆ½Ì¨µ÷Óà (P/Invoke)£©·Ç³£ÍêÉÆ¡£ÔÚ±¾×¨À¸ÖУ¬ÎÒ½«Öصã½éÉÜÈçºÎʵ¼ÊʹÓà P/Invoke À´µ÷Óà Windows API º¯Êý¡£µ±Ö¸ CLR µÄ COM Interop ¹¦ÄÜʱ£¬P/Invoke µ±×÷Ãû´ÊʹÓ㻵±Ö¸¸Ã¹¦ÄܵÄʹÓÃʱ£¬Ôò½«Æäµ±×÷¶¯´ÊʹÓá£ÎÒ²¢²»´òËãÖ±½Ó½éÉÜ COM Interop£¬ÒòΪËü±È P/Invoke ¾ßÓиüºÃµÄ¿É·ÃÎÊÐÔ£¬È´¸ü¼Ó¸´ÔÓ£¬ÕâÓеã×ÔÏàì¶Ü£¬ÕâʹµÃ½« COM Interop ×÷ΪרÀ¸Ö÷ÌâÀ´ÌÖÂÛ²»Ì«¼òÃ÷¶óÒª¡£
×ß½ø P/Invoke
Ê×ÏÈ´Ó¿¼²ìÒ»¸ö¼òµ¥µÄ P/Invoke ʾÀý¿ªÊ¼¡£ÈÃÎÒÃÇ¿´Ò»¿´ÈçºÎµ÷Óà Win32 MessageBeep º¯Êý£¬ËüµÄ·ÇÍйÜÉùÃ÷ÈçÒÔÏ´úÂëËùʾ£º
BOOL MessageBeep( UINT uType // beep type );ΪÁ˵÷Óà MessageBeep£¬ÄúÐèÒªÔÚ C# Öн«ÒÔÏ´úÂëÌí¼Óµ½Ò»¸öÀà»ò½á¹¹¶¨ÒåÖУº
[DllImport("User32.dll")] static extern Boolean MessageBeep(UInt32 beepType);ÁîÈ˾ªÑȵÄÊÇ£¬Ö»ÐèÒªÕâ¶Î´úÂë¾Í¿ÉÒÔʹÍйܴúÂëµ÷Ó÷ÇÍÐ¹ÜµÄ MessageBeep API¡£Ëü²»ÊÇÒ»¸ö·½·¨µ÷Ó㬶øÊÇÒ»¸öÍⲿ·½·¨¶¨Òå¡££¨ÁíÍ⣬Ëü½Ó½üÓÚÒ»¸öÀ´×Ô C ¶ø C# ÔÊÐíµÄÖ±½Ó¶Ë¿Ú£¬Òò´ËÒÔËüΪÆðµãÀ´½éÉÜһЩ¸ÅÄîÊÇÓаïÖúµÄ¡££©À´×ÔÍйܴúÂëµÄ¿ÉÄܵ÷ÓÃÈçÏÂËùʾ£º
MessageBeep(0);Çë×¢Ò⣬ÏÖÔÚ MessageBeep ·½·¨±»ÉùÃ÷Ϊ static¡£ÕâÊÇ P/Invoke ·½·¨ËùÒªÇóµÄ£¬ÒòΪÔڸà Windows API ÖÐûÓÐÒ»ÖµÄʵÀý¸ÅÄî¡£½ÓÏÂÀ´£¬»¹Òª×¢Òâ¸Ã·½·¨±»±ê¼ÇΪ extern¡£ÕâÊÇÌáʾ±àÒëÆ÷¸Ã·½·¨ÊÇͨ¹ýÒ»¸ö´Ó DLL µ¼³öµÄº¯ÊýʵÏֵģ¬Òò´Ë²»ÐèÒªÌṩ·½·¨Ìå¡£
˵µ½È±ÉÙ·½·¨Ì壬ÄúÊÇ·ñ×¢Òâµ½ MessageBeep ÉùÃ÷²¢Ã»Óаüº¬Ò»¸ö·½·¨Ì壿Óë´ó¶àÊýËã·¨ÓÉÖмäÓïÑÔ (IL) Ö¸Áî×é³ÉµÄÍйܷ½·¨²»Í¬£¬P/Invoke ·½·¨Ö»ÊÇÔªÊý¾Ý£¬ÊµÊ± (JIT) ±àÒëÆ÷ÔÚÔËÐÐʱͨ¹ýËü½«ÍйܴúÂëÓë·ÇÍÐ¹ÜµÄ DLL º¯ÊýÁ¬½ÓÆðÀ´¡£Ö´ÐÐÕâÖÖµ½·ÇÍйÜÊÀ½çµÄÁ¬½ÓËùÐèµÄÒ»¸öÖØÒªÐÅÏ¢¾ÍÊǵ¼³ö·ÇÍйܷ½·¨µÄ DLL µÄÃû³Æ¡£ÕâÒ»ÐÅÏ¢ÊÇÓÉ MessageBeep ·½·¨ÉùÃ÷֮ǰµÄ DllImport ×Ô¶¨ÒåÊôÐÔÌṩµÄ¡£ÔÚ±¾ÀýÖУ¬¿ÉÒÔ¿´µ½£¬MessageBeep ·ÇÍÐ¹Ü API ÊÇÓÉ Windows ÖÐµÄ User32.dll µ¼³öµÄ¡£
µ½ÏÖÔÚΪֹ£¬¹ØÓÚµ÷Óà MessageBeep ¾ÍÊ£Á½¸ö»°ÌâûÓнéÉÜ£¬Çë»Ø¹Ëһϣ¬µ÷ÓõĴúÂëÓëÒÔÏÂËùʾ´úÂëÆ¬¶Î·Ç³£ÏàËÆ£º
[DllImport("User32.dll")] static extern Boolean MessageBeep(UInt32 beepType);×îºóÕâÁ½¸ö»°ÌâÊÇÓëÊý¾Ý·âËÍ´¦Àí (data marshaling) ºÍ´ÓÍйܴúÂëµ½·ÇÍйܺ¯ÊýµÄʵ¼Ê·½·¨µ÷ÓÃÓйصϰÌâ¡£µ÷Ó÷ÇÍÐ¹Ü MessageBeep º¯Êý¿ÉÒÔÓÉÕÒµ½×÷ÓÃÓòÄÚµÄextern MessageBeep ÉùÃ÷µÄÈκÎÍйܴúÂëÖ´ÐС£¸Ãµ÷ÓÃÀàËÆÓÚÈÎºÎÆäËû¶Ô¾²Ì¬·½·¨µÄµ÷Óá£ËüÓëÆäËûÈκÎÍйܷ½·¨µ÷ÓõĹ²Í¬Ö®´¦ÔÚÓÚ´øÀ´ÁËÊý¾Ý·âËÍ´¦ÀíµÄÐèÒª¡£
C# µÄ¹æÔòÖ®Ò»ÊÇËüµÄµ÷ÓÃÓï·¨Ö»ÄÜ·ÃÎÊ CLR Êý¾ÝÀàÐÍ£¬ÀýÈç System.UInt32 ºÍ System.Boolean¡£C# ÏÔÈ»²»Ê¶±ð Windows API ÖÐʹÓõĻùÓÚ C µÄÊý¾ÝÀàÐÍ£¨ÀýÈç UINT ºÍ BOOL£©£¬ÕâЩÀàÐÍÖ»ÊÇ C ÓïÑÔÀàÐ͵ÄÀàÐͶ¨Òå¶øÒÑ¡£ËùÒÔµ± Windows API º¯Êý MessageBeep °´ÒÔÏ·½Ê½±àдʱ
BOOL MessageBeep( UINT uType )Íⲿ·½·¨¾Í±ØÐëʹÓà CLR ÀàÐÍÀ´¶¨Ò壬ÈçÄúÔÚÇ°ÃæµÄ´úÂëÆ¬¶ÎÖÐËù¿´µ½µÄ¡£ÐèҪʹÓÃÓë»ù´¡ API º¯ÊýÀàÐͲ»Í¬µ«ÓëÖ®¼æÈÝµÄ CLR ÀàÐÍÊÇ P/Invoke ½ÏÄÑʹÓõÄÒ»¸ö·½Ãæ¡£Òò´Ë£¬ÔÚ±¾×¨À¸µÄºóÃæÎÒ½«ÓÃÍêÕûµÄÕ½ÚÀ´½éÉÜÊý¾Ý·âËÍ´¦Àí¡£
Ñùʽ
ÔÚ C# ÖÐ¶Ô Windows API ½øÐÐ P/Invoke µ÷ÓÃÊǺܼòµ¥µÄ¡£µ«Èç¹ûÀà¿â¾Ü¾øÊ¹ÄúµÄÓ¦ÓóÌÐò·¢³öà½Éù£¬Ó¦¸ÃÏë·½Éè·¨µ÷Óà Windows ʹËü½øÐÐÕâÏ×÷£¬ÊÇÂð£¿
Êǵġ£µ«ÊÇÓëÑ¡ÔñµÄ·½·¨Óйأ¬¶øÇÒ¹ØÏµÉõ´ó£¡Í¨³££¬Èç¹ûÀà¿âÌṩijÖÖ;¾¶À´ÊµÏÖÄúµÄÒâͼ£¬Ôò×îºÃʹÓà API ¶ø²»ÒªÖ±½Óµ÷Ó÷ÇÍйܴúÂ룬ÒòΪ CLR ÀàÐÍºÍ Win32 Ö®¼äÔÚÑùʽÉÏÓкܴóµÄ²»Í¬¡£ÎÒ¿ÉÒÔ½«¹ØÓÚÕâ¸öÎÊÌâµÄ½¨Òé¹é½áΪһ¾ä»°¡£µ±Äú½øÐÐ P/Invoke ʱ£¬²»ÒªÊ¹Ó¦ÓóÌÐòÂß¼Ö±½ÓÊôÓÚÈκÎÍⲿ·½·¨»òÆäÖеĹ¹¼þ¡£Èç¹ûÄú×ñÑÕâ¸öС¹æÔò£¬´Ó³¤Ô¶¿´¾³£»áʡȥÐí¶àµÄÂé·³¡£
ͼ 1 ÖеĴúÂëÏÔʾÁËÎÒËùÌÖÂÛµÄ MessageBeep Íⲿ·½·¨µÄ×îÉÙ¸½¼Ó´úÂ롣ͼ 1 Öв¢Ã»ÓÐÈκÎÏÔÖøµÄ±ä»¯£¬¶øÖ»ÊǶÔÎÞ°ü×°µÄÍⲿ·½·¨½øÐÐһЩÆÕͨµÄ¸Ä½ø£¬Õâ¿ÉÒÔʹ¹¤×÷¸ü¼ÓÇáËÉһЩ¡£´Ó¶¥²¿¿ªÊ¼£¬Äú»á×¢Òâµ½Ò»¸öÃûΪ Sound µÄÍêÕûÀàÐÍ£¬ËüרÓÃÓÚ MessageBeep¡£Èç¹ûÎÒÐèҪʹÓà Windows API º¯Êý PlaySound À´Ìí¼Ó¶Ô²¥·Å²¨ÐεÄÖ§³Ö£¬Ôò¿ÉÒÔÖØÓà Sound ÀàÐÍ¡£È»¶ø£¬ÎÒ²»»áÒò¹«¿ªµ¥¸ö¹«¹²¾²Ì¬·½·¨µÄÀàÐͶøÉúÆø¡£±Ï¾¹ÕâÖ»ÊÇÓ¦ÓóÌÐò´úÂë¶øÒÑ¡£»¹Ó¦¸Ã×¢Òâµ½£¬Sound ÊÇÃÜ·âµÄ£¬²¢¶¨ÒåÁËÒ»¸ö¿ÕµÄ˽Óй¹Ô캯Êý¡£ÕâЩֻÊÇһЩϸ½Ú£¬Ä¿µÄÊÇʹÓû§²»»á´íÎóµØ´Ó Sound ÅÉÉúÀà»òÕß´´½¨ËüµÄʵÀý¡£
ͼ 1 ÖеĴúÂëµÄÏÂÒ»¸öÌØÕ÷ÊÇ£¬P/Invoke ³öÏÖλÖõÄʵ¼ÊÍⲿ·½·¨ÊÇ Sound µÄ˽Óз½·¨¡£Õâ¸ö·½·¨Ö»ÊÇÓɹ«¹² MessageBeep ·½·¨¼ä½Ó¹«¿ª£¬ºóÕß½ÓÊÜ BeepTypes ÀàÐ͵IJÎÊý¡£Õâ¸ö¼ä½ÓµÄ¶îÍâ²ãÊÇÒ»¸öºÜ¹Ø¼üµÄϸ½Ú£¬ËüÌṩÁËÒÔϺô¦¡£Ê×ÏÈ£¬Ó¦¸ÃÔÚÀà¿âÖÐÒýÈëÒ»¸öδÀ´µÄ beep Íйܷ½·¨£¬¿ÉÒÔÖØ¸´µØÍ¨¹ý¹«¹² MessageBeep ·½·¨À´Ê¹ÓÃÍÐ¹Ü API£¬¶ø²»±Ø¸ü¸ÄÓ¦ÓóÌÐòÖÐµÄÆäÓà´úÂë¡£
¸Ã°ü×°·½·¨µÄµÚ¶þ¸öºÃ´¦ÊÇ£ºµ±Äú½øÐÐ P/Invoke µ÷ÓÃʱ£¬Äú·ÅÆúÁËÃâÊÜ·ÃÎʳåÍ»ºÍÆäËûµÍ¼¶ÆÆ»µµÄȨÀû£¬Õâͨ³£ÊÇÓÉ CLR ÌṩµÄ¡£»º³å·½·¨¿ÉÒÔ±£»¤ÄúµÄÓ¦ÓóÌÐòµÄÆäÓಿ·ÖÃâÊÜ·ÃÎʳåÍ»¼°ÀàËÆÎÊÌâµÄÓ°Ï죨¼´Ê¹Ëü²»×öÈκÎʶøÖ»ÊÇ´«µÝ²ÎÊý£©¡£¸Ã»º³å·½·¨½«ÓÉ P/Invoke µ÷ÓÃÒýÈëµÄÈκÎDZÔڵĴíÎ󱾵ػ¯¡£
½«Ë½ÓÐÍⲿ·½·¨Òþ²ØÔÚ¹«¹²°ü×°ºóÃæµÄµÚÈýͬʱҲÊÇ×îºóµÄÒ»¸öºÃ´¦ÊÇ£¬ÌṩÁËÏò¸Ã·½·¨Ìí¼ÓһЩ×îСµÄ CLR ÑùʽµÄ»ú»á¡£ÀýÈ磬ÔÚͼ 1 ÖУ¬ÎÒ½« Windows API º¯Êý·µ»ØµÄ Boolean ʧ°Üת»»³É¸üÏñ CLR µÄÒì³£¡£ÎÒ»¹¶¨ÒåÁËÒ»¸öÃûΪ BeepTypes µÄö¾ÙÀàÐÍ£¬ËüµÄ³ÉÔ±¶ÔÓ¦ÓÚͬ¸Ã Windows API Ò»ÆðʹÓõ͍ÒåÖµ¡£ÓÉÓÚ C# ²»Ö§³Ö¶¨Ò壬Òò´Ë¿ÉÒÔʹÓÃÍйÜö¾ÙÀàÐÍÀ´±ÜÃâ»ÃÊýÏòÕû¸öÓ¦ÓóÌÐò´úÂëÀ©É¢¡£
°ü×°·½·¨µÄ×îºóÒ»¸öºÃ´¦¶ÔÓÚ¼òµ¥µÄ Windows API º¯Êý£¨Èç MessageBeep£©³ÏÈ»ÊÇ΢²»×ãµÀµÄ¡£µ«Êǵ±Äú¿ªÊ¼µ÷Óøü¸´ÔӵķÇÍйܺ¯Êýʱ£¬Äú»á·¢ÏÖ£¬ÊÖ¶¯½« Windows API Ñùʽת»»³É¶Ô CLR ¸ü¼ÓÓѺõķ½·¨Ëù´øÀ´µÄºÃ´¦»áÔ½À´Ô½¶à¡£Ô½ÊÇ´òËãÔÚÕû¸öÓ¦ÓóÌÐòÖÐÖØÓà interop ¹¦ÄÜ£¬Ô½ÊÇÓ¦¸ÃÈÏÕæµØ¿¼Âǰü×°µÄÉè¼Æ¡£Í¬Ê±ÎÒÈÏΪ£¬ÔÚ·ÇÃæÏò¶ÔÏóµÄ¾²Ì¬°ü×°·½·¨ÖÐʹÓÃ¶Ô CLR ÓѺõIJÎÊýÒ²²¢·Ç²»¿ÉÒÔ¡£
DLL Import ÊôÐÔ
ÏÖÔÚÊǸüÉîÈëµØ½øÐÐ̽ÌÖµÄʱºòÁË¡£ÔÚ¶ÔÍйܴúÂë½øÐÐ P/Invoke µ÷ÓÃʱ£¬DllImportAttribute ÀàÐͰçÑÝ×ÅÖØÒªµÄ½ÇÉ«¡£DllImportAttribute µÄÖ÷Òª×÷ÓÃÊǸø CLR ָʾÄĸö DLL µ¼³öÄúÏëÒªµ÷Óõĺ¯Êý¡£Ïà¹Ø DLL µÄÃû³Æ±»×÷Ϊһ¸ö¹¹Ô캯Êý²ÎÊý´«µÝ¸ø DllImportAttribute¡£
Èç¹ûÄúÎÞ·¨¿Ï¶¨Äĸö DLL ¶¨ÒåÁËÄúҪʹÓÃµÄ Windows API º¯Êý£¬Platform SDK Îĵµ½«ÎªÄúÌṩ×îºÃµÄ°ïÖú×ÊÔ´¡£ÔÚ Windows API º¯ÊýÖ÷ÌâÎÄ×ÖÁÙ½ü½áβµÄλÖã¬SDK ÎĵµÖ¸¶¨ÁË C Ó¦ÓóÌÐòҪʹÓøú¯Êý±ØÐëÁ´½ÓµÄ .lib Îļþ¡£ÔÚ¼¸ºõËùÓеÄÇé¿öÏ£¬¸Ã .lib Îļþ¾ßÓÐÓ붨Òå¸Ãº¯ÊýµÄϵͳ DLL ÎļþÏàͬµÄÃû³Æ¡£ÀýÈ磬Èç¹û¸Ãº¯ÊýÐèÒª C Ó¦ÓóÌÐòÁ´½Óµ½ Kernel32.lib£¬Ôò¸Ãº¯Êý¾Í¶¨ÒåÔÚ Kernel32.dll ÖС£Äú¿ÉÒÔÔÚ MessageBeep ÖÐÕÒµ½ÓÐ¹Ø MessageBeep µÄ Platform SDK ÎĵµÖ÷Ìâ¡£ÔÚ¸ÃÖ÷Ìâ½áβ´¦£¬Äú»á×¢Òâµ½ËüÖ¸³ö¿âÎļþÊÇ User32.lib£»Õâ±íÃ÷ MessageBeep ÊÇ´Ó User32.dll Öе¼³öµÄ¡£
¿ÉÑ¡µÄ DllImportAttribute ÊôÐÔ
³ýÁËÖ¸³öËÞÖ÷ DLL Í⣬DllImportAttribute »¹°üº¬ÁËһЩ¿ÉÑ¡ÊôÐÔ£¬ÆäÖÐËĸöÌØ±ðÓÐȤ£ºEntryPoint¡¢CharSet¡¢SetLastError ºÍ CallingConvention¡£
EntryPoint ÔÚ²»Ï£ÍûÍⲿÍйܷ½·¨¾ßÓÐÓë DLL µ¼³öÏàͬµÄÃû³ÆµÄÇé¿öÏ£¬¿ÉÒÔÉèÖøÃÊôÐÔÀ´Ö¸Ê¾µ¼³öµÄ DLL º¯ÊýµÄÈë¿ÚµãÃû³Æ¡£µ±Äú¶¨ÒåÁ½¸öµ÷ÓÃÏàͬ·ÇÍйܺ¯ÊýµÄÍⲿ·½·¨Ê±£¬ÕâÌØ±ðÓÐÓá£ÁíÍ⣬ÔÚ Windows Öл¹¿ÉÒÔͨ¹ýËüÃǵÄÐòºÅÖµ°ó¶¨µ½µ¼³öµÄ DLL º¯Êý¡£Èç¹ûÄúÐèÒªÕâÑù×ö£¬ÔòÖîÈç¡°#1¡±»ò¡°#129¡±µÄ EntryPoint ֵָʾ DLL ÖзÇÍйܺ¯ÊýµÄÐòºÅÖµ¶ø²»ÊǺ¯ÊýÃû¡£
CharSet ¶ÔÓÚ×Ö·û¼¯£¬²¢·ÇËùÓа汾µÄ Windows ¶¼ÊÇͬÑù´´½¨µÄ¡£Windows 9x ϵÁвúƷȱÉÙÖØÒªµÄ Unicode Ö§³Ö£¬¶ø Windows NT ºÍ Windows CE ϵÁÐÔòÒ»¿ªÊ¼¾ÍʹÓà Unicode¡£ÔÚÕâЩ²Ù×÷ϵͳÉÏÔËÐÐµÄ CLR ½«Unicode ÓÃÓÚ String ºÍ Char Êý¾ÝµÄÄÚ²¿±íʾ¡£µ«Ò²²»±Øµ£ÐÄ ¡ª µ±µ÷Óà Windows 9x API º¯Êýʱ£¬CLR »á×Ô¶¯½øÐбØÒªµÄת»»£¬½«Æä´Ó Unicodeת»»Îª ANSI¡£
Èç¹û DLL º¯Êý²»ÒÔÈκη½Ê½´¦ÀíÎı¾£¬Ôò¿ÉÒÔºöÂÔ DllImportAttribute µÄ CharSet ÊôÐÔ¡£È»¶ø£¬µ± Char »ò String Êý¾ÝÊǵÈʽµÄÒ»²¿·Öʱ£¬Ó¦¸Ã½« CharSet ÊôÐÔÉèÖÃΪ CharSet.Auto¡£ÕâÑù¿ÉÒÔʹ CLR ¸ù¾ÝËÞÖ÷ OS ʹÓÃÊʵ±µÄ×Ö·û¼¯¡£Èç¹ûûÓÐÏÔʽµØÉèÖà CharSet ÊôÐÔ£¬ÔòÆäĬÈÏֵΪ CharSet.Ansi¡£Õâ¸öĬÈÏÖµÊÇÓÐȱµãµÄ£¬ÒòΪ¶ÔÓÚÔÚ Windows 2000¡¢Windows XP ºÍ Windows NT® ÉϽøÐÐµÄ interop µ÷Óã¬Ëü»áÏû¼«µØÓ°ÏìÎı¾²ÎÊý·âËÍ´¦ÀíµÄÐÔÄÜ¡£
Ó¦¸ÃÏÔʽµØÑ¡Ôñ CharSet.Ansi »ò CharSet.Unicode µÄ CharSet Öµ¶ø²»ÊÇʹÓà CharSet.Auto µÄΨһÇé¿öÊÇ£ºÄúÏÔʽµØÖ¸¶¨ÁËÒ»¸öµ¼³öº¯Êý£¬¶ø¸Ãº¯ÊýÌØ¶¨ÓÚÕâÁ½ÖÖ Win32 OS ÖеÄijһÖÖ¡£ReadDirectoryChangesW API º¯Êý¾ÍÊÇÕâÑùµÄÒ»¸öÀý×Ó£¬ËüÖ»´æÔÚÓÚ»ùÓÚ Windows NT µÄ²Ù×÷ϵͳÖУ¬²¢ÇÒÖ»Ö§³Ö Unicode£»ÔÚÕâÖÖÇé¿öÏ£¬ÄúÓ¦¸ÃÏÔʽµØÊ¹Óà CharSet.Unicode¡£
ÓÐʱ£¬Windows API ÊÇ·ñÓÐ×Ö·û¼¯¹ØÏµ²¢²»Ã÷ÏÔ¡£Ò»ÖÖ¾ö²»»áÓдíµÄÈ·ÈÏ·½·¨ÊÇÔÚ Platform SDK Öмì²é¸Ãº¯ÊýµÄ C ÓïÑÔÍ·Îļþ¡££¨Èç¹ûÄúÎÞ·¨¿Ï¶¨Òª¿´ÄĸöÍ·Îļþ£¬Ôò¿ÉÒԲ鿴 Platform SDK ÎĵµÖÐÁгöµÄÿ¸ö API º¯ÊýµÄÍ·Îļþ¡££©Èç¹ûÄú·¢Ïָà API º¯Êýȷʵ¶¨ÒåΪһ¸öÓ³Éäµ½ÒÔ A »ò W ½áβµÄº¯ÊýÃûµÄºê£¬Ôò×Ö·û¼¯ÓëÄú³¢ÊÔµ÷Óõĺ¯ÊýÓйØÏµ¡£Windows API º¯ÊýµÄÒ»¸öÀý×ÓÊÇÔÚ WinUser.h ÖÐÉùÃ÷µÄ GetMessage API£¬ÄúÒ²Ðí»á¾ªÑȵط¢ÏÖËüÓÐ A ºÍ W Á½ÖÖ°æ±¾¡£
SetLastError ´íÎó´¦Àí·Ç³£ÖØÒª£¬µ«ÔÚ±à³Ìʱ¾³£±»ÒÅÍü¡£µ±Äú½øÐÐ P/Invoke µ÷ÓÃʱ£¬Ò²»áÃæÁÙÆäËûµÄÌôÕ½ ¡ª ´¦ÀíÍйܴúÂëÖÐ Windows API ´íÎó´¦ÀíºÍÒì³£Ö®¼äµÄÇø±ð¡£ÎÒ¿ÉÒÔ¸øÄúÒ»µã½¨Òé¡£
Èç¹ûÄúÕýÔÚʹÓà P/Invoke µ÷Óà Windows API º¯Êý£¬¶ø¶ÔÓڸú¯Êý£¬ÄúʹÓà GetLastError À´²éÕÒÀ©Õ¹µÄ´íÎóÐÅÏ¢£¬ÔòÓ¦¸ÃÔÚÍⲿ·½·¨µÄ DllImportAttribute Öн« SetLastError ÊôÐÔÉèÖÃΪ true¡£ÕâÊÊÓÃÓÚ´ó¶àÊýÍⲿ·½·¨¡£
Õâ»áµ¼Ö CLR ÔÚÿ´Îµ÷ÓÃÍⲿ·½·¨Ö®ºó»º´æÓÉ API º¯ÊýÉèÖõĴíÎó¡£È»ºó£¬ÔÚ°ü×°·½·¨ÖУ¬¿ÉÒÔͨ¹ýµ÷ÓÃÀà¿âµÄ System.Runtime.InteropServices.Marshal ÀàÐÍÖж¨ÒåµÄ Marshal.GetLastWin32Error ·½·¨À´»ñÈ¡»º´æµÄ´íÎóÖµ¡£ÎҵĽ¨ÒéÊǼì²éÕâЩÆÚÍûÀ´×Ô API º¯ÊýµÄ´íÎóÖµ£¬²¢ÎªÕâЩֵÒý·¢Ò»¸ö¿É¸ÐÖªµÄÒì³£¡£¶ÔÓÚÆäËûËùÓÐʧ°ÜÇé¿ö£¨°üÀ¨¸ù±¾¾ÍûÒâÁϵ½µÄʧ°ÜÇé¿ö£©£¬ÔòÒý·¢ÔÚ System.ComponentModel ÃüÃû¿Õ¼äÖж¨ÒåµÄ Win32Exception£¬²¢½« Marshal.GetLastWin32Error ·µ»ØµÄÖµ´«µÝ¸øËü¡£Èç¹ûÄú»ØÍ·¿´Ò»ÏÂͼ 1 ÖеĴúÂ룬Äú»á¿´µ½ÎÒÔÚ extern MessageBeep ·½·¨µÄ¹«¹²°ü×°ÖоͲÉÓÃÁËÕâÖÖ·½·¨¡£
CallingConvention ÎÒ½«Ôڴ˽éÉܵÄ×îºóÒ²¿ÉÄÜÊÇ×î²»ÖØÒªµÄÒ»¸ö DllImportAttribute ÊôÐÔÊÇ CallingConvention¡£Í¨¹ý´ËÊôÐÔ£¬¿ÉÒÔ¸ø CLR ָʾӦ¸Ã½«ÄÄÖÖº¯Êýµ÷ÓÃÔ¼¶¨ÓÃÓÚ¶ÑÕ»ÖеIJÎÊý¡£CallingConvention.Winapi µÄĬÈÏÖµÊÇ×îºÃµÄÑ¡Ôñ£¬ËüÔÚ´ó¶àÊýÇé¿ö϶¼¿ÉÐС£È»¶ø£¬Èç¹û¸Ãµ÷Óò»Æð×÷Óã¬Ôò¿ÉÒÔ¼ì²é Platform SDK ÖеÄÉùÃ÷Í·Îļþ£¬¿´¿´Äúµ÷ÓÃµÄ API º¯ÊýÊÇ·ñÊÇÒ»¸ö²»·ûºÏµ÷ÓÃÔ¼¶¨±ê×¼µÄÒì³£ API¡£
ͨ³££¬±¾»úº¯Êý£¨ÀýÈç Windows API º¯Êý»ò C- ÔËÐÐʱ DLL º¯Êý£©µÄµ÷ÓÃÔ¼¶¨ÃèÊöÁËÈçºÎ½«²ÎÊýÍÆÈëÏ̶߳ÑÕ»»ò´ÓÏ̶߳ÑÕ»ÖÐÇå³ý¡£´ó¶àÊý Windows API º¯Êý¶¼ÊÇÊ×ÏȽ«º¯ÊýµÄ×îºóÒ»¸ö²ÎÊýÍÆÈë¶ÑÕ»£¬È»ºóÓɱ»µ÷Óõĺ¯Êý¸ºÔðÇåÀí¸Ã¶ÑÕ»¡£Ïà·´£¬Ðí¶à C-ÔËÐÐʱ DLL º¯Êý¶¼±»¶¨ÒåΪ°´ÕÕ·½·¨²ÎÊýÔÚ·½·¨Ç©ÃûÖгöÏÖµÄ˳Ðò½«ÆäÍÆÈë¶ÑÕ»£¬½«¶ÑÕ»ÇåÀí¹¤×÷½»¸øµ÷ÓÃÕß¡£
ÐÒÔ˵ÄÊÇ£¬ÒªÈà P/Invoke µ÷Óù¤×÷Ö»ÐèÒªÈÃÍâΧÉ豸Àí½âµ÷ÓÃÔ¼¶¨¼´¿É¡£Í¨³££¬´ÓĬÈÏÖµ CallingConvention.Winapi ¿ªÊ¼ÊÇ×îºÃµÄÑ¡Ôñ¡£È»ºó£¬ÔÚ C ÔËÐÐʱ DLL º¯ÊýºÍÉÙÊýº¯ÊýÖУ¬¿ÉÄÜÐèÒª½«Ô¼¶¨¸ü¸ÄΪ CallingConvention.Cdecl¡£
Êý¾Ý·âËÍ´¦Àí
Êý¾Ý·âËÍ´¦ÀíÊÇ P/Invoke ¾ßÓÐÌôÕ½ÐԵķ½Ãæ¡£µ±ÔÚÍйܺͷÇÍйܴúÂëÖ®¼ä´«µÝÊý¾Ýʱ£¬CLR ×ñÑÐí¶à¹æÔò£¬ºÜÉÙÓпª·¢ÈËÔ±»á¾³£Óöµ½ËüÃÇÖ±ÖÁ¿É½«ÕâЩ¹æÔò¼Çס¡£³ý·ÇÄúÊÇÒ»ÃûÀà¿â¿ª·¢ÈËÔ±£¬·ñÔòÔÚͨ³£Çé¿öÏÂûÓбØÒªÕÆÎÕÆäϸ½Ú¡£ÎªÁË×îÓÐЧµØÔÚ CLR ÉÏʹÓà P/Invoke£¬¼´Ê¹Ö»Å¼¶ûÐèÒª interop µÄÓ¦ÓóÌÐò¿ª·¢ÈËÔ±ÈÔȻӦ¸ÃÀí½âÊý¾Ý·âËÍ´¦ÀíµÄһЩ»ù´¡ÖªÊ¶¡£
ÔÚ±¾ÔÂרÀ¸µÄÊ£Óಿ·ÖÖУ¬ÎÒ½«ÌÖÂÛ¼òµ¥Êý×ÖºÍ×Ö·û´®Êý¾ÝµÄÊý¾Ý·âËÍ´¦Àí¡£ÎÒ½«´Ó×î»ù±¾µÄÊý×ÖÊý¾Ý·âËÍ´¦Àí¿ªÊ¼£¬È»ºó½éÉܼòµ¥µÄÖ¸Õë·âËÍ´¦ÀíºÍ×Ö·û´®·âËÍ´¦Àí¡£
·âËÍÊý×ÖºÍÂß¼±êÁ¿
Windows OS ´ó²¿·ÖÊÇÓà C ±àдµÄ¡£Òò´Ë£¬Windows API ËùÓõ½µÄÊý¾ÝÀàÐÍҪôÊÇ C ÀàÐÍ£¬ÒªÃ´ÊÇͨ¹ýÀàÐͶ¨Òå»òºê¶¨ÒåÖØÐ±ê¼ÇµÄ C ÀàÐÍ¡£ÈÃÎÒÃÇ¿´¿´Ã»ÓÐÖ¸ÕëµÄÊý¾Ý·âËÍ´¦Àí¡£¼òµ¥Æð¼û£¬Ê×ÏÈÖØµãÌÖÂÛµÄÊÇÊý×ֺͲ¼¶ûÖµ¡£
µ±Í¨¹ýÖµÏò Windows API º¯Êý´«µÝ²ÎÊýʱ£¬ÐèÒªÖªµÀÒÔÏÂÎÊÌâµÄ´ð°¸£º
| • |
Êý¾Ý´Ó¸ù±¾ÉϽ²ÊÇÕûÐ͵ϹÊǸ¡µãÐ͵ģ¿ |
| • |
Èç¹ûÊý¾ÝÊÇÕûÐ͵ģ¬ÔòËüÊÇÓзûºÅµÄ»¹ÊÇÎÞ·ûºÅµÄ£¿ |
| • |
Èç¹ûÊý¾ÝÊÇÕûÐ͵ģ¬ÔòËüµÄλÊýÊǶàÉÙ£¿ |
| • |
Èç¹ûÊý¾ÝÊǸ¡µãÐ͵ģ¬ÔòËüÊǵ¥¾«¶ÈµÄ»¹ÊÇË«¾«¶ÈµÄ£¿ |
ÓÐʱ´ð°¸ºÜÃ÷ÏÔ£¬µ«ÓÐʱȴ²»Ã÷ÏÔ¡£Windows API ÒÔ¸÷ÖÖ·½Ê½ÖØÐ¶¨ÒåÁË»ù±¾µÄ C Êý¾ÝÀàÐÍ¡£Í¼ 2 ÁгöÁË C ºÍ Win32 µÄһЩ¹«¹²Êý¾ÝÀàÐͼ°Æä¹æ·¶£¬ÒÔ¼°Ò»¸ö¾ßÓÐÆ¥Å乿·¶µÄ¹«¹²ÓïÑÔÔËÐпâÀàÐÍ¡£
ͨ³££¬Ö»ÒªÄúÑ¡ÔñÒ»¸öÆä¹æ·¶Óë¸Ã²ÎÊýµÄ Win32 ÀàÐÍÏàÆ¥ÅäµÄ CLR ÀàÐÍ£¬ÄúµÄ´úÂë¾ÍÄܹ»Õý³£¹¤×÷¡£²»¹ýÒ²ÓÐÒ»Ð©ÌØÀý¡£ÀýÈ磬ÔÚ Windows API Öж¨ÒåµÄ BOOL ÀàÐÍÊÇÒ»¸öÓзûºÅµÄ 32 λÕûÐÍ¡£È»¶ø£¬BOOL ÓÃÓÚָʾ Boolean Öµ true »ò false¡£ËäÈ»Äú²»Óý« BOOL ²ÎÊý×÷Ϊ System.Int32 Öµ·âËÍ£¬µ«ÊÇÈç¹ûʹÓà System.Boolean ÀàÐÍ£¬¾Í»á»ñµÃ¸üºÏÊʵÄÓ³Éä¡£×Ö·ûÀàÐ͵ÄÓ³ÉäÀàËÆÓÚ BOOL£¬ÒòΪÓÐÒ»¸öÌØ¶¨µÄ CLR ÀàÐÍ (System.Char) Ö¸³ö×Ö·ûµÄº¬Òå¡£
ÔÚÁ˽âÕâЩÐÅÏ¢Ö®ºó£¬Öð²½½éÉÜʾÀý¿ÉÄÜÊÇÓаïÖúµÄ¡£ÒÀÈ»²ÉÓà beep Ö÷Ìâ×÷ΪÀý×Ó£¬ÈÃÎÒÃÇÀ´ÊÔһϠKernel32.dll µÍ¼¶ Beep£¬Ëü»áͨ¹ý¼ÆËã»úµÄÑïÉùÆ÷·¢Éúà½Éù¡£Õâ¸ö·½·¨µÄ Platform SDK Îĵµ¿ÉÒÔÔÚ Beep ÖÐÕÒµ½¡£±¾»ú API °´ÒÔÏ·½Ê½½øÐмǼ£º
BOOL Beep( DWORD dwFreq, // Frequency DWORD dwDuration // Duration in milliseconds );ÔÚ²ÎÊý·âËÍ´¦Àí·½Ãæ£¬ÄúµÄ¹¤×÷ÊÇÁ˽âʲô CLR Êý¾ÝÀàÐÍÓë Beep API º¯ÊýËùʹÓÃµÄ DWORD ºÍ BOOL Êý¾ÝÀàÐÍÏà¼æÈÝ¡£»Ø¹ËÒ»ÏÂͼ 2 ÖеÄͼ±í£¬Äú½«¿´µ½ DWORD ÊÇÒ»¸ö 32 λµÄÎÞ·ûºÅÕûÊýÖµ£¬Èçͬ CLR ÀàÐÍ System.UInt32¡£ÕâÒâζ×ÅÄú¿ÉÒÔʹÓà UInt32 Öµ×÷ΪËÍÍù Beep µÄÁ½¸ö²ÎÊý¡£BOOL ·µ»ØÖµÊÇÒ»¸ö·Ç³£ÓÐȤµÄÇé¿ö£¬ÒòΪ¸Ãͼ±í¸æËßÎÒÃÇ£¬ÔÚ Win32 ÖУ¬BOOL ÊÇÒ»¸ö 32 λµÄÓзûºÅÕûÊý¡£Òò´Ë£¬Äú¿ÉÒÔʹÓà System.Int32 Öµ×÷ΪÀ´×Ô Beep µÄ·µ»ØÖµ¡£È»¶ø£¬CLR Ò²¶¨ÒåÁË System.Boolean ÀàÐÍ×÷Ϊ Boolean ÖµµÄÓïÒ壬ËùÒÔÓ¦¸ÃʹÓÃËüÀ´Ìæ´ú¡£CLR ĬÈϽ« System.Boolean Öµ·âËÍΪ 32 λµÄÓзûºÅÕûÊý¡£´Ë´¦ËùÏÔʾµÄÍⲿ·½·¨¶¨ÒåÊÇÓÃÓÚ Beep µÄ½á¹û P/Invoke ·½·¨£º
[DllImport("Kernel32.dll", SetLastError=true)] static extern Boolean Beep( UInt32 frequency, UInt32 duration);Ö¸Õë²ÎÊý
Ðí¶à Windows API º¯Êý½«Ö¸Õë×÷ΪËüÃǵÄÒ»¸ö»ò¶à¸ö²ÎÊý¡£Ö¸ÕëÔö¼ÓÁË·âËÍÊý¾ÝµÄ¸´ÔÓÐÔ£¬ÒòΪËüÃÇÔö¼ÓÁËÒ»¸ö¼ä½Ó²ã¡£Èç¹ûûÓÐÖ¸Õ룬Äú¿ÉÒÔͨ¹ýÖµÔÚÏ̶߳ÑÕ»Öд«µÝÊý¾Ý¡£ÓÐÁËÖ¸Õ룬Ôò¿ÉÒÔͨ¹ýÒýÓô«µÝÊý¾Ý£¬·½·¨Êǽ«¸ÃÊý¾ÝµÄÄÚ´æµØÖ·ÍÆÈëÏ̶߳ÑÕ»ÖС£È»ºó£¬º¯Êýͨ¹ýÄÚ´æµØÖ·¼ä½Ó·ÃÎÊÊý¾Ý¡£Ê¹ÓÃÍйܴúÂë±íʾ´Ë¸½¼Ó¼ä½Ó²ãµÄ·½Ê½ÓжàÖÖ¡£
ÔÚ C# ÖУ¬Èç¹û½«·½·¨²ÎÊý¶¨ÒåΪ ref »ò out£¬ÔòÊý¾Ýͨ¹ýÒýÓöø²»ÊÇͨ¹ýÖµ´«µÝ¡£¼´Ê¹ÄúûÓÐʹÓà Interop Ò²ÊÇÕâÑù£¬µ«Ö»ÊÇ´ÓÒ»¸öÍйܷ½·¨µ÷Óõ½ÁíÒ»¸öÍйܷ½·¨¡£ÀýÈ磬Èç¹ûͨ¹ý ref ´«µÝ System.Int32 ²ÎÊý£¬ÔòÔÚÏ̶߳ÑÕ»Öд«µÝµÄÊǸÃÊý¾ÝµÄµØÖ·£¬¶ø²»ÊÇÕûÊýÖµ±¾Éí¡£ÏÂÃæÊÇÒ»¸ö¶¨ÒåΪͨ¹ýÒýÓýÓÊÕÕûÊýÖµµÄ·½·¨µÄʾÀý£º
void FlipInt32(ref Int32 num){ num = -num; }ÕâÀFlipInt32 ·½·¨»ñȡһ¸ö Int32 ÖµµÄµØÖ·¡¢·ÃÎÊÊý¾Ý¡¢¶ÔËüÇó·´£¬È»ºó½«Çó·´¹ýµÄÖµ¸³¸øÔʼ±äÁ¿¡£ÔÚÒÔÏ´úÂëÖУ¬FlipInt32 ·½·¨»á½«µ÷ÓóÌÐòµÄ±äÁ¿ x µÄÖµ´Ó 10 ¸ü¸ÄΪ -10£º
Int32 x = 10; FlipInt32(ref x);ÔÚÍйܴúÂëÖпÉÒÔÖØÓÃÕâÖÖÄÜÁ¦£¬½«Ö¸Õë´«µÝ¸ø·ÇÍйܴúÂë¡£ÀýÈ磬FileEncryptionStatus API º¯ÊýÒÔ 32 λÎÞ·ûºÅλÑÚÂëµÄÐÎʽ·µ»ØÎļþ¼ÓÃÜ״̬¡£¸Ã API °´ÒÔÏÂËùʾ·½Ê½½øÐмǼ£º
BOOL FileEncryptionStatus( LPCTSTR lpFileName, // file name LPDWORD lpStatus // encryption status );Çë×¢Ò⣬¸Ãº¯Êý²¢²»Ê¹ÓÃËüµÄ·µ»ØÖµ·µ»Ø×´Ì¬£¬¶øÊÇ·µ»ØÒ»¸ö Boolean Öµ£¬Ö¸Ê¾µ÷ÓÃÊÇ·ñ³É¹¦¡£Ôڳɹ¦µÄÇé¿öÏ£¬Êµ¼ÊµÄ״ֵ̬ÊÇͨ¹ýµÚ¶þ¸ö²ÎÊý·µ»ØµÄ¡£ËüµÄ¹¤×÷·½Ê½Êǵ÷ÓóÌÐòÏò¸Ãº¯Êý´«µÝÖ¸ÏòÒ»¸ö DWORD ±äÁ¿µÄÖ¸Õ룬¶ø¸Ã API º¯ÊýÓÃ״ֵ̬Ìî³äÖ¸ÏòµÄÄÚ´æÎ»Öá£ÒÔÏ´úÂëÆ¬¶ÎÏÔʾÁËÒ»¸öµ÷Ó÷ÇÍÐ¹Ü FileEncryptionStatus º¯ÊýµÄ¿ÉÄÜÍⲿ·½·¨¶¨Ò壺
[DllImport("Advapi32.dll", CharSet=CharSet.Auto)] static extern Boolean FileEncryptionStatus(String filename, out UInt32 status);¸Ã¶¨ÒåʹÓà out ¹Ø¼ü×ÖÀ´Îª UInt32 ״ֵָ̬ʾ by-ref ²ÎÊý¡£ÕâÀïÎÒÒ²¿ÉÒÔÑ¡Ôñ ref ¹Ø¼ü×Ö£¬Êµ¼ÊÉÏÔÚÔËÐÐʱ»á²úÉúÏàͬµÄ»úÆ÷Âë¡£out ¹Ø¼ü×ÖÖ»ÊÇÒ»¸ö by-ref ²ÎÊýµÄ¹æ·¶£¬ËüÏò C# ±àÒëÆ÷ָʾËù´«µÝµÄÊý¾ÝÖ»ÔÚ±»µ÷Óõĺ¯ÊýÍⲿ´«µÝ¡£Ïà·´£¬Èç¹ûʹÓà ref ¹Ø¼ü×Ö£¬Ôò±àÒëÆ÷»á¼Ù¶¨Êý¾Ý¿ÉÒÔÔÚ±»µ÷Óõĺ¯ÊýµÄÄÚ²¿ºÍÍⲿ´«µÝ¡£
ÍйܴúÂëÖÐ out ºÍ ref ²ÎÊýµÄÁíÒ»¸öºÜºÃµÄ·½ÃæÊÇ£¬µØÖ·×÷Ϊ by-ref ²ÎÊý´«µÝµÄ±äÁ¿¿ÉÒÔÊÇÏ̶߳ÑÕ»ÖеÄÒ»¸ö±¾µØ±äÁ¿¡¢Ò»¸öÀà»ò½á¹¹µÄÔªËØ£¬Ò²¿ÉÒÔÊǾßÓкÏÊÊÊý¾ÝÀàÐ͵ÄÊý×éÖеÄÒ»¸öÔªËØÒýÓᣵ÷ÓóÌÐòµÄÕâÖÖÁé»îÐÔʹµÃ by-ref ²ÎÊý³ÉΪ·âËÍ»º³åÇøÖ¸ÕëÒÔ¼°µ¥ÊýÖµÖ¸ÕëµÄÒ»¸öºÜºÃµÄÆðµã¡£Ö»ÓÐÔÚÎÒ·¢ÏÖ ref »ò out ²ÎÊý²»·ûºÏÎÒµÄÐèÒªµÄÇé¿öÏ£¬ÎҲŻῼÂǽ«Ö¸Õë·âËÍΪ¸ü¸´Ô CLR ÀàÐÍ£¨ÀýÈçÀà»òÊý×é¶ÔÏ󣩡£
Èç¹ûÄú²»ÊìϤ C Óï·¨»òÕßµ÷Óà Windows API º¯Êý£¬ÓÐʱºÜÄÑÖªµÀÒ»¸ö·½·¨²ÎÊýÊÇ·ñÐèÒªÖ¸Õë¡£Ò»¸ö³£¼ûµÄָʾ·ûÊÇ¿´²ÎÊýÀàÐÍÊÇ·ñÊÇÒÔ×Öĸ P »ò LP ¿ªÍ·µÄ£¬ÀýÈç LPDWORD »ò PINT¡£ÔÚÕâÁ½¸öÀý×ÓÖУ¬LP ºÍ P ָʾ²ÎÊýÊÇÒ»¸öÖ¸Õ룬¶øËüÃÇÖ¸ÏòµÄÊý¾ÝÀàÐÍ·Ö±ðΪ DWORD »ò INT¡£È»¶ø£¬ÔÚÓÐЩÇé¿öÏ£¬¿ÉÒÔÖ±½ÓʹÓà C ÓïÑÔÓï·¨ÖеÄÐǺŠ(*) ½« API º¯Êý¶¨ÒåΪָÕë¡£ÒÔÏ´úÂëÆ¬¶ÎչʾÁËÕâ·½ÃæµÄʾÀý£º
void TakesAPointer(DWORD* pNum);¿ÉÒÔ¿´µ½£¬ÉÏÊöº¯ÊýµÄΨһһ¸ö²ÎÊýÊÇÖ¸Ïò DWORD ±äÁ¿µÄÖ¸Õë¡£
µ±Í¨¹ý P/Invoke ·âËÍÖ¸Õëʱ£¬ref ºÍ out Ö»ÓÃÓÚÍйܴúÂëÖеÄÖµÀàÐÍ¡£µ±Ò»¸ö²ÎÊýµÄ CLR ÀàÐÍʹÓà struct ¹Ø¼ü×Ö¶¨Òåʱ£¬¿ÉÒÔÈÏΪ¸Ã²ÎÊýÊÇÒ»¸öÖµÀàÐÍ¡£Out ºÍ ref ÓÃÓÚ·âËÍÖ¸ÏòÕâЩÊý¾ÝÀàÐ͵ÄÖ¸Õ룬ÒòΪͨ³£ÖµÀàÐͱäÁ¿ÊǶÔÏó»òÊý¾Ý£¬¶øÔÚÍйܴúÂëÖв¢Ã»ÓжÔÖµÀàÐ͵ÄÒýÓá£Ïà·´£¬µ±·âËÍÒýÓÃÀàÐͶÔÏóʱ£¬²¢²»ÐèÒª ref ºÍ out ¹Ø¼ü×Ö£¬ÒòΪ±äÁ¿ÒѾÊǶÔÏóµÄÒýÓÃÁË¡£
Èç¹ûÄú¶ÔÒýÓÃÀàÐͺÍÖµÀàÐÍÖ®¼äµÄ²î±ð²»ÊǺÜÊìϤ£¬Çë²éÔÄ 2000 Äê 12 Ô ·¢ÐÐµÄ MSDN® Magazine£¬ÔÚ .NET רÀ¸µÄÖ÷ÌâÖпÉÒÔÕÒµ½¸ü¶àÐÅÏ¢¡£´ó¶àÊý CLR ÀàÐͶ¼ÊÇÒýÓÃÀàÐÍ£»È»¶ø£¬³ýÁË System.String ºÍ System.Object£¬ËùÓеĻùÔªÀàÐÍ£¨ÀýÈç System.Int32 ºÍ System.Boolean£©¶¼ÊÇÖµÀàÐÍ¡£
·âËͲ»Í¸Ã÷ (Opaque) Ö¸Õ룺һÖÖÌØÊâÇé¿ö
ÓÐʱÔÚ Windows API ÖУ¬·½·¨´«µÝ»ò·µ»ØµÄÖ¸ÕëÊDz»Í¸Ã÷µÄ£¬ÕâÒâζןÃÖ¸ÕëÖµ´Ó¼¼Êõ½Ç¶È½²ÊÇÒ»¸öÖ¸Õ룬µ«´úÂëÈ´²»Ö±½ÓʹÓÃËü¡£Ïà·´£¬´úÂ뽫¸ÃÖ¸Õë·µ»Ø¸ø Windows ÒÔ±ãËæºó½øÐÐÖØÓá£
Ò»¸ö·Ç³£³£¼ûµÄÀý×Ó¾ÍÊǾä±úµÄ¸ÅÄî¡£ÔÚ Windows ÖУ¬ÄÚ²¿Êý¾Ý½á¹¹£¨´ÓÎļþµ½ÆÁÄ»Éϵİ´Å¥£©ÔÚÓ¦ÓóÌÐò´úÂëÖж¼±íʾΪ¾ä±ú¡£¾ä±úÆäʵ¾ÍÊDz»Í¸Ã÷µÄÖ¸Õë»òÓÐ×ÅÖ¸Õë¿í¶ÈµÄÊýÖµ£¬Ó¦ÓóÌÐòÓÃËüÀ´±íʾÄÚ²¿µÄ OS ¹¹Ôì¡£
ÉÙÊýÇé¿öÏ£¬API º¯ÊýÒ²½«²»Í¸Ã÷Ö¸Õ붨ÒåΪ PVOID »ò LPVOID ÀàÐÍ¡£ÔÚ Windows API µÄ¶¨ÒåÖУ¬ÕâЩÀàÐÍÒâ˼¾ÍÊÇ˵¸ÃÖ¸ÕëûÓÐÀàÐÍ¡£
µ±Ò»¸ö²»Í¸Ã÷Ö¸Õë·µ»Ø¸øÄúµÄÓ¦ÓóÌÐò£¨»òÕßÄúµÄÓ¦ÓóÌÐòÆÚÍûµÃµ½Ò»¸ö²»Í¸Ã÷Ö¸Õ룩ʱ£¬ÄúÓ¦¸Ã½«²ÎÊý»ò·µ»ØÖµ·âËÍΪ CLR ÖеÄÒ»ÖÖÌØÊâÀàÐÍ ¡ª System.IntPtr¡£µ±ÄúʹÓà IntPtr ÀàÐÍʱ£¬Í¨³£²»Ê¹Óà out »ò ref ²ÎÊý£¬ÒòΪ IntPtr ÒâΪֱ½Ó³ÖÓÐÖ¸Õë¡£²»¹ý£¬Èç¹ûÄú½«Ò»¸öÖ¸Õë·âËÍΪһ¸öÖ¸Õ룬Ôò¶Ô IntPtr ʹÓà by-ref ²ÎÊýÊǺÏÊʵġ£
ÔÚ CLR ÀàÐÍϵͳÖУ¬System.IntPtr ÀàÐÍÓÐÒ»¸öÌØÊâµÄÊôÐÔ¡£²»ÏñϵͳÖÐµÄÆäËû»ùÀàÐÍ£¬IntPtr ²¢Ã»Óй̶¨µÄ´óС¡£Ïà·´£¬ËüÔÚÔËÐÐʱµÄ´óСÊÇÒÀµ×²ã²Ù×÷ϵͳµÄÕý³£Ö¸Õë´óС¶ø¶¨µÄ¡£ÕâÒâζ×ÅÔÚ 32 λµÄ Windows ÖУ¬IntPtr ±äÁ¿µÄ¿í¶ÈÊÇ 32 λµÄ£¬¶øÔÚ 64 λµÄ Windows ÖУ¬ÊµÊ±±àÒëÆ÷±àÒëµÄ´úÂë»á½« IntPtr Öµ¿´×÷ 64 λµÄÖµ¡£µ±ÔÚÍйܴúÂëºÍ·ÇÍйܴúÂëÖ®¼ä·âËͲ»Í¸Ã÷Ö¸Õëʱ£¬ÕâÖÖ×Ô¶¯µ÷½Ú´óСµÄÌØµãÊ®·ÖÓÐÓá£
Çë¼Çס£¬Èκηµ»Ø»ò½ÓÊܾä±úµÄ API º¯ÊýÆäʵ²Ù×÷µÄ¾ÍÊDz»Í¸Ã÷Ö¸Õë¡£ÄúµÄ´úÂëÓ¦¸Ã½« Windows Öеľä±ú·âËÍ³É System.IntPtr Öµ¡£
Äú¿ÉÒÔÔÚÍйܴúÂëÖн« IntPtr ÖµÇ¿ÖÆ×ª»»Îª 32 λ»ò 64 λµÄÕûÊýÖµ£¬»ò½«ºóÕßÇ¿ÖÆ×ª»»ÎªÇ°Õß¡£È»¶ø£¬µ±Ê¹Óà Windows API º¯Êýʱ£¬ÒòΪָÕëÓ¦ÊDz»Í¸Ã÷µÄ£¬ËùÒÔ³ýÁË´æ´¢ºÍ´«µÝ¸øÍⲿ·½·¨Í⣬²»Äܽ«ËüÃÇÁí×öËüÓá£ÕâÖÖ¡°Ö»ÏÞ´æ´¢ºÍ´«µÝ¡±¹æÔòµÄÁ½¸öÌØÀýÊǵ±ÄúÐèÒªÏòÍⲿ·½·¨´«µÝ null Ö¸ÕëÖµºÍÐèÒª±È½Ï IntPtr ÖµÓë null ÖµµÄÇé¿ö¡£ÎªÁË×öµ½ÕâÒ»µã£¬Äú²»Äܽ«ÁãÇ¿ÖÆ×ª»»Îª System.IntPtr£¬¶øÓ¦¸ÃÔÚ IntPtr ÀàÐÍÉÏʹÓà Int32.Zero ¾²Ì¬¹«¹²×ֶΣ¬ÒÔ±ã»ñµÃÓÃÓڱȽϻò¸³ÖµµÄ null Öµ¡£
·âËÍÎı¾
ÔÚ±à³Ìʱ¾³£Òª¶ÔÎı¾Êý¾Ý½øÐд¦Àí¡£Îı¾Îª interop ÖÆÔìÁËһЩÂé·³£¬ÕâÓÐÁ½¸öÔÒò¡£Ê×ÏÈ£¬µ×²ã²Ù×÷ϵͳ¿ÉÄÜʹÓà Unicode À´±íʾ×Ö·û´®£¬Ò²¿ÉÄÜʹÓà ANSI¡£ÔÚ¼«ÉÙÊýÇé¿öÏ£¬ÀýÈç MultiByteToWideChar API º¯ÊýµÄÁ½¸ö²ÎÊýÔÚ×Ö·û¼¯ÉÏÊDz»Ò»Öµġ£
µÚ¶þ¸öÔÒòÊÇ£¬µ±ÐèÒª½øÐÐ P/Invoke ʱ£¬Òª´¦ÀíÎı¾»¹ÐèÒªÌØ±ðÁ˽⵽ C ºÍ CLR ´¦ÀíÎı¾µÄ·½Ê½ÊDz»Í¬µÄ¡£ÔÚ C ÖУ¬×Ö·û´®Êµ¼ÊÉÏÖ»ÊÇÒ»¸ö×Ö·ûÖµÊý×飬ͨ³£ÒÔ null ×÷Ϊ½áÊø·û¡£´ó¶àÊý Windows API º¯ÊýÊǰ´ÕÕÒÔÏÂÌõ¼þ´¦Àí×Ö·û´®µÄ£º¶ÔÓÚ ANSI£¬½«Æä×÷Ϊ×Ö·ûÖµÊý×飻¶ÔÓÚ Unicode£¬½«Æä×÷Ϊ¿í×Ö·ûÖµÊý×é¡£
ÐÒÔ˵ÄÊÇ£¬CLR ±»Éè¼ÆµÃÏ൱Áé»î£¬µ±·âËÍÎı¾Ê±ÎÊÌâµÃÒÔÇáËɽâ¾ö£¬¶ø²»ÓÃÔÚÒâ Windows API º¯ÊýÆÚÍû´ÓÄúµÄÓ¦ÓóÌÐòµÃµ½µÄÊÇʲô¡£ÕâÀïÊÇһЩÐèÒª¼ÇסµÄÖ÷Òª¿¼ÂÇÊÂÏ
| • |
ÊÇÄúµÄÓ¦ÓóÌÐòÏò API º¯Êý´«µÝÎı¾Êý¾Ý£¬»¹ÊÇ API º¯ÊýÏòÄúµÄÓ¦ÓóÌÐò·µ»Ø×Ö·û´®Êý¾Ý£¿»òÕß¶þÕß¼æÓУ¿ |
| • |
ÄúµÄÍⲿ·½·¨Ó¦¸ÃʹÓÃʲôÍйÜÀàÐÍ£¿ |
| • |
API º¯ÊýÆÚÍûµÃµ½µÄÊÇʲô¸ñʽµÄ·ÇÍйÜ×Ö·û´®£¿ |
ÎÒÃÇÊ×ÏȽâ´ð×îºóÒ»¸öÎÊÌâ¡£´ó¶àÊý Windows API º¯Êý¶¼´øÓÐ LPTSTR »ò LPCTSTR Öµ¡££¨´Óº¯Êý½Ç¶È¿´£©ËüÃÇ·Ö±ðÊÇ¿ÉÐ޸ĺͲ»¿ÉÐ޸ĵĻº³åÇø£¬°üº¬ÒÔ null ½áÊøµÄ×Ö·ûÊý×é¡£¡°C¡±´ú±í³£Êý£¬Òâζ×ÅʹÓøòÎÊýÐÅÏ¢²»»á´«µÝµ½º¯ÊýÍⲿ¡£LPTSTR Öеġ°T¡±±íÃ÷¸Ã²ÎÊý¿ÉÒÔÊÇ Unicode »ò ANSI£¬È¡¾öÓÚÄúÑ¡ÔñµÄ×Ö·û¼¯ºÍµ×²ã²Ù×÷ϵͳµÄ×Ö·û¼¯¡£ÒòΪÔÚ Windows API Öдó¶àÊý×Ö·û´®²ÎÊý¶¼ÊÇÕâÁ½ÖÖÀàÐÍÖ®Ò»£¬ËùÒÔÖ»ÒªÔÚ DllImportAttribute ÖÐÑ¡Ôñ CharSet.Auto£¬CLR ¾Í°´Ä¬Èϵķ½Ê½¹¤×÷¡£
È»¶ø£¬ÓÐЩ API º¯Êý»ò×Ô¶¨ÒåµÄ DLL º¯Êý²ÉÓò»Í¬µÄ·½Ê½±íʾ×Ö·û´®¡£Èç¹ûÄúÒªÓõ½Ò»¸öÕâÑùµÄº¯Êý£¬¾Í¿ÉÒÔ²ÉÓà MarshalAsAttribute ÐÞÊÎÍⲿ·½·¨µÄ×Ö·û´®²ÎÊý£¬²¢Ö¸Ã÷Ò»ÖÖ²»Í¬ÓÚĬÈÏ LPTSTR µÄ×Ö·û´®¸ñʽ¡£ÓÐ¹Ø MarshalAsAttribute µÄ¸ü¶àÐÅÏ¢£¬Çë²ÎÔÄλÓÚ MarshalAsAttribute Class µÄ Platform SDK ÎĵµÖ÷Ìâ¡£
ÏÖÔÚÈÃÎÒÃÇ¿´Ò»ÏÂ×Ö·û´®ÐÅÏ¢ÔÚÄúµÄ´úÂëºÍ·ÇÍйܺ¯ÊýÖ®¼ä´«µÝµÄ·½Ïò¡£ÓÐÁ½ÖÖ·½Ê½¿ÉÒÔÖªµÀ´¦Àí×Ö·û´®Ê±ÐÅÏ¢µÄ´«µÝ·½Ïò¡£µÚÒ»¸öÒ²ÊÇ×î¿É¿¿µÄÒ»¸ö·½·¨¾ÍÊÇÊ×ÏÈÀí½â²ÎÊýµÄÓÃ;¡£ÀýÈ磬ÄúÕýµ÷ÓÃÒ»¸ö²ÎÊý£¬ËüµÄÃû³ÆÀàËÆ CreateMutex ²¢´øÓÐÒ»¸ö×Ö·û´®£¬Ôò¿ÉÒÔÏëÏñ¸Ã×Ö·û´®ÐÅÏ¢ÊÇ´ÓÓ¦ÓóÌÐòÏò API º¯Êý´«µÝµÄ¡£Í¬Ê±£¬Èç¹ûÄúµ÷Óà GetUserName£¬Ôò¸Ãº¯ÊýµÄÃû³Æ±íÃ÷×Ö·û´®ÐÅÏ¢ÊǴӸú¯ÊýÏòÄúµÄÓ¦ÓóÌÐò´«µÝµÄ¡£
³ýÁËÕâÖֱȽϺÏÀíµÄ·½·¨Í⣬µÚ¶þÖÖ²éÕÒÐÅÏ¢´«µÝ·½ÏòµÄ·½Ê½¾ÍÊDzéÕÒ API ²ÎÊýÀàÐÍÖеÄ×Öĸ¡°C¡±¡£ÀýÈ磬GetUserName API º¯ÊýµÄµÚÒ»¸ö²ÎÊý±»¶¨ÒåΪ LPTSTR ÀàÐÍ£¬Ëü´ú±íÒ»¸öÖ¸Ïò Unicode »ò ANSI ×Ö·û´®»º³åÇøµÄ³¤Ö¸Õë¡£µ«ÊÇ CreateMutex µÄÃû³Æ²ÎÊý±»ÀàÐÍ»¯Îª LTCTSTR¡£Çë×¢Ò⣬ÕâÀïµÄÀàÐͶ¨ÒåÊÇÒ»ÑùµÄ£¬µ«Ôö¼ÓÒ»¸ö×Öĸ¡°C¡±À´±íÃ÷»º³åÇøÎª³£Êý£¬API º¯Êý²»ÄÜдÈë¡£
Ò»µ©Ã÷È·ÁËÎı¾²ÎÊýÊÇÖ»ÓÃ×÷ÊäÈ뻹ÊÇÓÃ×÷ÊäÈë/Êä³ö£¬¾Í¿ÉÒÔÈ·¶¨Ê¹ÓÃÄÄÖÖ CLR ÀàÐÍ×÷Ϊ²ÎÊýÀàÐÍ¡£ÕâÀïÓÐһЩ¹æÔò¡£Èç¹û×Ö·û´®²ÎÊýÖ»ÓÃ×÷ÊäÈ룬ÔòʹÓà System.String ÀàÐÍ¡£ÔÚÍйܴúÂëÖУ¬×Ö·û´®ÊDz»±äµÄ£¬ÊʺÏÓÃÓÚ²»»á±»±¾»ú API º¯Êý¸ü¸ÄµÄ»º³åÇø¡£
Èç¹û×Ö·û´®²ÎÊý¿ÉÒÔÓÃ×÷ÊäÈëºÍ/»òÊä³ö£¬ÔòʹÓà System.StringBuilder ÀàÐÍ¡£StringBuilder ÀàÐÍÊÇÒ»¸öºÜÓÐÓõÄÀà¿âÀàÐÍ£¬Ëü¿ÉÒÔ°ïÖúÄúÓÐЧµØ¹¹½¨×Ö·û´®£¬Ò²ÕýºÃ¿ÉÒÔ½«»º³åÇø´«µÝ¸ø±¾»úº¯Êý£¬Óɱ¾»úº¯ÊýΪÄúÌî³ä×Ö·û´®Êý¾Ý¡£Ò»µ©º¯Êýµ÷Ó÷µ»Ø£¬ÄúÖ»ÐèÒªµ÷Óà StringBuilder ¶ÔÏóµÄ ToString ¾Í¿ÉÒԵõ½Ò»¸ö String ¶ÔÏó¡£
GetShortPathName API º¯ÊýÄܺܺõØÓÃÓÚÏÔʾʲôʱºòʹÓà String¡¢Ê²Ã´Ê±ºòʹÓà StringBuilder£¬ÒòΪËüÖ»´øÓÐÈý¸ö²ÎÊý£ºÒ»¸öÊäÈë×Ö·û´®¡¢Ò»¸öÊä³ö×Ö·û´®ºÍÒ»¸öÖ¸Ã÷Êä³ö»º³åÇøµÄ×Ö·û³¤¶ÈµÄ²ÎÊý¡£
ͼ 3 ËùʾΪ¼Ó×¢Ê͵ķÇÍÐ¹Ü GetShortPathName º¯ÊýÎĵµ£¬Ëüͬʱָ³öÁËÊäÈëºÍÊä³ö×Ö·û´®²ÎÊý¡£ËüÒý³öÁËÍйܵÄÍⲿ·½·¨¶¨Ò壬ҲÈçͼ 3 Ëùʾ¡£Çë×¢ÒâµÚÒ»¸ö²ÎÊý±»·âËÍΪ System.String£¬ÒòΪËüÊÇÒ»¸öÖ»ÓÃ×÷ÊäÈëµÄ²ÎÊý¡£µÚ¶þ¸ö²ÎÊý´ú±íÒ»¸öÊä³ö»º³åÇø£¬ËüʹÓÃÁË System.StringBuilder¡£
С½á
±¾ÔÂרÀ¸Ëù½éÉÜµÄ P/Invoke ¹¦ÄÜ×ã¹»µ÷Óà Windows ÖеÄÐí¶à API º¯Êý¡£È»¶ø£¬Èç¹ûÄú´óÁ¿Óõ½ interop£¬Ôò»á×îÖÕ·¢ÏÖ×Ô¼º·âËÍÁ˺ܸ´ÔÓµÄÊý¾Ý½á¹¹£¬ÉõÖÁ¿ÉÄÜÐèÒªÔÚÍйܴúÂëÖÐͨ¹ýÖ¸ÕëÖ±½Ó·ÃÎÊÄڴ档ʵ¼ÊÉÏ£¬±¾»ú´úÂëÖÐµÄ interop ¿ÉÒÔÊÇÒ»¸ö½«Ï¸½ÚºÍµÍ¼¶±ÈÌØ²ØÔÚÀïÃæµÄÕæÕýµÄÅ˶àÀºÐ×Ó¡£CLR¡¢C# ºÍÍÐ¹Ü C++ ÌṩÁËÐí¶àÓÐÓõŦÄÜ£»Ò²ÐíÒÔºóÎÒ»áÔÚ±¾×¨À¸½éÉܸ߼¶µÄ P/Invoke »°Ìâ¡£
ͬʱ£¬Ö»ÒªÄú¾õµÃ .NET Framework Àà¿âÎÞ·¨²¥·ÅÄúµÄÉùÒô»òÕßΪÄúÖ´ÐÐÆäËûһЩ¹¦ÄÜ£¬Äú¿ÉÒÔÖªµÀÈçºÎÏòÔʼ¶øÓÅÐãµÄ Windows API ѰÇóһЩ°ïÖú¡£
Figure 1 MessageBeep, Interop Done Well
namespace Wintellect.Interop.Sound{
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
sealed class Sound{
public static void MessageBeep(BeepTypes type){
if(!MessageBeep((UInt32) type)){
Int32 err = Marshal.GetLastWin32Error();
throw new Win32Exception(err);
}
}
[DllImport("User32.dll", SetLastError=true)]
static extern Boolean MessageBeep(UInt32 beepType);
private Sound(){}
}
enum BeepTypes{
Simple = -1,
Ok = 0x00000000,
IconHand = 0x00000010,
IconQuestion = 0x00000020,
IconExclamation = 0x00000030,
IconAsterisk = 0x00000040
}
}
Figure 2 Non-Pointer Data Types
| Win32 Types | Specification | CLR Type |
|---|---|---|
| char, INT8, SBYTE, CHAR†| 8-bit signed integer | System.SByte |
| short, short int, INT16, SHORT | 16-bit signed integer | System.Int16 |
| int, long, long int, INT32, LONG32, BOOL†, INT | 32-bit signed integer | System.Int32 |
| __int64, INT64, LONGLONG | 64-bit signed integer | System.Int64 |
| unsigned char, UINT8, UCHAR†, BYTE | 8-bit unsigned integer | System.Byte |
| unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR†, __wchar_t | 16-bit unsigned integer | System.UInt16 |
| unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT | 32-bit unsigned integer | System.UInt32 |
| unsigned __int64, UINT64, DWORDLONG, ULONGLONG | 64-bit unsigned integer | System.UInt64 |
| float, FLOAT | Single-precision floating point | System.Single |
| double, long double, DOUBLE | Double-precision floating point | System.Double |
| †In Win32 this type is an integer with a specially assigned meaning; in contrast, the CLR provides a specific type devoted to this meaning. | ||
Figure 3 GetShortPathName Declarations// ** Documentation for Win32 GetShortPathName() API Function // DWORD GetShortPathName( // LPCTSTR lpszLongPath, // file for which to get short path // LPTSTR lpszShortPath, // short path name (output) // DWORD cchBuffer // size of output buffer // ); [DllImport("Kernel32", CharSet = CharSet.Auto)] static extern Int32 GetShortPathName( String path, // input string StringBuilder shortPath, // output string Int32 shortPathLength); // StringBuilder.Capacity
- · ÓÃc#ʵÏÖÒ»¸ö¼ÆËã³ÌÐòÆô¶¯Ê±¼äµÄ¹¹Ïë
- · ÈçºÎÓÃC#±àдÎı¾±à¼Æ÷
- · ÊÖ¹¤´´½¨datagridµÄÊý¾ÝÁУ¨c# window£©
- · C#ʵÏÖ¶ÔÏóµÄXml¸ñʽÐòÁл¯¼°·´ÐòÁл¯
- · »ÊºóÎÊÌâÖ®C#°æ£¨·ÇµÝ¹é£©
- · ±©Á¦Ëã·¨½âÒæÖÇÌâ(c#2.0°æ±¾)
- · C#»æÍ¼(¿ÉÒÔ´¦Àí¸ºÖµ)
- · C# WinForm±à³ÌÖеÄÒ»µãСÊÕ»ñ£¨¶þ£©
- · C#ÖÐʹÓÃSendMessage
- · еÄAutoCAD2006 ÍйÜC#³ÌÐòÏòµ¼
- · MapX ¿Ø¼þÔÚC# ÖеÄÓ¦ÓÃ
- · ÓÃADSI¿ØÖÆIIS´´½¨ÍøÕ¾, ÐéÄâĿ¼¡¡ (C#)
- · C#ÖÐÊý¾Ý¿â²Ù×÷Ïà¹Ø
- · ½â¶ÁC££ÖеĹæÔò±í´ïʽ
- · C# and .NET Framework books
- · C# and .NET Framework books
- · C# WinForm ÖÐÔÚ´°¿Ú±êÌâÀ¸ÉϼӰ´Å¥
- · C#WinFormÖÆ×÷ÒìÐδ°Ìå/¿Ø¼þ
- · C#ÔÚ¿Í‘ô¶ËºÍ·þ„ն˲Ù×÷ExcelÎļþ
- · ÓÃADSI¿ØÖÆIIS´´½¨ÍøÕ¾, ÐéÄâĿ¼¡¡ (C#)
- · c# kmpËã·¨ £¨±ß½çÌõ¼þδ´¦ÀíºÃ£¬Óдý¸ÄÕý£©
- · ¸ßЧµÄ¹ÜÀí×Ó´°Ì壨c#£©
- · ×î¼òµ¥µÄ×Ö·û´®¼ÓÃÜC#ʵÏÖ£ÒÆÎ»¼ÓÃÜ
- · [C#]½â¾ö¶Áд°üº¬ºº×ÖµÄtxtÎļþʱÂÒÂëµÄÎÊÌâ
- · C# WinForm±à³ÌÖеÄÒ»µãСÊÕ»ñ
- · Êղأ¨c#.net³£Óú¯ÊýÁÐ±í£©
- · C#ÖÐÈçºÎ»ñȡע²á±íÐÅÏ¢
- · ÓÃC#ʵÏÖ¼òµ¥µÄ¿Ø¼þÊý×é
- · ÔÚC#.netÖÐÈçºÎ²Ù×÷XML
- · C# FAQ for C++ programmers
- · Çë½ÌÈçºÎ¸ÄÉÆC#ÖÐsocketͨÐÅ»ú¿Í»§¶Ë³ÌÐòµÄ½¡×³ÐÔ
- · C££ÖеÄÓò£¨field£©ºÍÊôÐÔ£¨property£©
- · C££ÖеÄÊý×éºÍC£«£«ÖÐÊý×éµÄÇø±ð
- · C££ÖеÄchecked¡¢unchecked²Ù×÷·û
- · C££Öз½·¨²ÎÊýµÄËÄÖÖÀàÐÍ
- · C££Öеġ°×°Ï䡱£¨boxing£©Óë¡°²ðÏ䡱£¨unboxing£©
- · C#ÖеĴúÀí£¨delegate£©
- · C#ÖÐʹÓÃDirectX±à³Ì
