Ò»£ºÈëÃÅ£¬Ö±½Ó´Ó C# µ÷Óà DLL µ¼³ö
ÆäʵÎÒÃǵÄÒéÌâÓ¦¸Ã½Ð×öC#ÈçºÎÖ±½Óµ÷Ó÷ÇÍйܴúÂ룬ͨ³£ÓÐ2ÖÖ·½·¨£º
1£® Ö±½Óµ÷ÓÃ´Ó DLL µ¼³öµÄº¯Êý¡£
2£® µ÷Óà COM ¶ÔÏóÉϵĽӿڷ½·¨
ÎÒÖ÷ÒªÌÖÂÛ´ÓdllÖе¼³öº¯Êý£¬»ù±¾²½ÖèÈçÏ£º
1£®Ê¹Óà C# ¹Ø¼ü×Ö static ºÍ extern ÉùÃ÷·½·¨¡£
2£®½« DllImport ÊôÐÔ¸½¼Óµ½¸Ã·½·¨¡£DllImport ÊôÐÔÔÊÐíÄúÖ¸¶¨°üº¬¸Ã·½·¨µÄ DLL µÄÃû³Æ¡£
3£®Èç¹ûÐèÒª£¬Îª·½·¨µÄ²ÎÊýºÍ·µ»ØÖµÖ¸¶¨×Ô¶¨Òå·âËÍ´¦ÀíÐÅÏ¢£¬Õâ½«ÖØÐ´ .NET Framework µÄĬÈÏ·âËÍ´¦Àí¡£
ºÃ£¬ÎÒÃÇ¿ªÊ¼
1£®Ê×ÏÈÎÒÃDzéѯMSDNÕÒµ½GetShortPathNameµÄ¶¨Òå
The GetShortPathName function retrieves the short path form of the specified path.
DWORD GetShortPathName(
LPCTSTR lpszLongPath,
LPTSTR lpszShortPath,
DWORD cchBuffer
);
|
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. |
3£®µ÷ÓÃGetShortPathNameÕâ¸öAPI£¬¼òµ¥µÄд·¨ÈçÏ£¨±àÒëͨ¹ýµÄ»°£©£¬
using System;
using System.Runtime.InteropServices;
public class MSSQL_ServerHandler
{
[DllImport("kernel32.dll")]
public static extern int GetShortPathName
(
string path,
StringBuilder shortPath,
int shortPathLength
)
}
¶øÎÒÃÇ֮ǰµÄÀý×Ó£º
using System;
using System.Runtime.InteropServices;
public class MSSQL_ServerHandler
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName
(
[MarshalAs(UnmanagedType.LPTStr)] string path,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,
int shortPathLength
)
}
¶Ô±È¿ÉÖª£¬ÆäÖÐDllImport £¬static£¬extern»ù±¾ÉÏÊDZØÐëÓе쬯äËûCharSet£¬MarshalAs£¨¡£©ÊÇ¿ÉÑ¡ÏÔÚÕâÀTʹûÓУ¬³ÌÐòÒ²ÊÇ¿ÉÒÔµ÷ÓôËAPIÁË¡£
˵Ã÷£º
1£®MSSQL_ServerHandler. GetShortPathName ·½·¨Óà static ºÍ extern ÐÞÊηûÉùÃ÷²¢ÇÒ¾ßÓÐ DllImport ÊôÐÔ£¬¸ÃÊôÐÔʹÓÃĬÈÏÃû³ÆGetShortPathName ֪ͨ±àÒëÆ÷´ËʵÏÖÀ´×Ôkernel32.dll¡£ÈôÒª¶Ô C# ·½·¨Ê¹Óò»Í¬µÄÃû³Æ£¨Èç getShort£©£¬Ôò±ØÐëÔÚ DllImport ÊôÐÔÖÐʹÓà EntryPoint Ñ¡ÏÈçÏÂËùʾ£º
[DllImport("kernel32.dll", EntryPoint="getShort")]
2£®Ê¹ÓÃMarshalAs(UnmanagedType.LPTStr)±£Ö¤ÁËÔÚÈÎºÎÆ½Ì¨É϶¼»áµÃµ½LPTStr£¬·ñÔòĬÈϵķ½Ê½»á°Ñ´ÓC#ÖеÄ×Ö·û´®×÷ΪBStr´«µÝ¡£
ÏÖÔÚÈç¹ûÊǽöº¬Óмòµ¥²ÎÊýºÍ·µ»ØÖµµÄWIN32 API£¬¾Í¶¼¿ÉÒÔÀûÓÃÕâÖÖ·½·¨½øÐжÔÕÕ£¬¼òµ¥µÄ¸ÄдºÍµ÷ÓÃÁË¡£
¶þ£®±³ºóµÄÔÀí ¨D¨D ÖªÆäËùÒÔÈ»£¬Ïà¹ØµÄ֪ʶ
1£®Æ½Ì¨µ÷ÓÃÏêÔÀí
ƽ̨µ÷ÓÃÒÀÀµÓÚÔªÊý¾ÝÔÚÔËÐÐʱ²éÕÒµ¼³öµÄº¯Êý²¢·âËÍÆä²ÎÊý¡£ÏÂͼÏÔʾÁËÕâÒ»¹ý³Ì¡£
¶Ô·ÇÍÐ¹Ü DLL º¯ÊýµÄ¡°Æ½Ì¨µ÷Óá±µ÷ÓÃ
µ±¡°Æ½Ì¨µ÷Óá±µ÷Ó÷ÇÍйܺ¯Êýʱ£¬Ëü½«ÒÀ´ÎÖ´ÐÐÒÔϲÙ×÷£º
²éÕÒ°üº¬¸Ãº¯ÊýµÄ DLL¡£
½«¸Ã DLL ¼ÓÔØµ½ÄÚ´æÖС£
²éÕÒº¯ÊýÔÚÄÚ´æÖеĵØÖ·²¢½«Æä²ÎÊýÍÆµ½¶ÑÕ»ÉÏ£¬ÒÔ·âËÍËùÐèµÄÊý¾Ý¡£
×¢Òâ Ö»ÔÚµÚÒ»´Îµ÷Óú¯Êýʱ£¬²Å»á²éÕҺͼÓÔØ DLL ²¢²éÕÒº¯ÊýÔÚÄÚ´æÖеĵØÖ·¡£
½«¿ØÖÆÈ¨×ªÒƸø·ÇÍйܺ¯Êý¡£
ƽ̨µ÷ÓûáÏòÍйܵ÷Ó÷½Òý·¢ÓÉ·ÇÍйܺ¯ÊýÉú³ÉµÄÒì³£¡£
2£®¹ØÓÚAttribute£¨ÊôÐÔ£¬×¢ÒâÀ¶É«×Ö£©
ÊôÐÔ¿ÉÒÔ·ÅÖÃÔÚ¼¸ºõËùÓÐÉùÃ÷ÖУ¨µ«Ìض¨µÄÊôÐÔ¿ÉÄÜÏÞÖÆËüÔÚÆäÉÏÓÐЧµÄÉùÃ÷ÀàÐÍ£©¡£ÔÚÓï·¨ÉÏ£¬ÊôÐÔµÄÖ¸¶¨·½·¨Îª£º½«À¨ÔÚ·½À¨ºÅÖеÄÊôÐÔÃûÖÃÓÚÆäÊÊÓõÄʵÌåÉùÃ÷֮ǰ¡£ÀýÈ磬¾ßÓÐ DllImport ÊôÐÔµÄÀཫÉùÃ÷ÈçÏ£º
[DllImport] public class MyDllimportClass { ... }
Ðí¶àÊôÐÔ¶¼´ø²ÎÊý£¬¶øÕâЩ²ÎÊý¿ÉÒÔÊǶ¨Î»£¨Î´ÃüÃû£©²ÎÊýÒ²¿ÉÒÔÊÇÃüÃû²ÎÊý¡£Èκζ¨Î»²ÎÊý¶¼±ØÐë°´ÌØ¶¨Ë³ÐòÖ¸¶¨²¢ÇÒ²»ÄÜÊ¡ÂÔ£¬¶øÃüÃû²ÎÊýÊÇ¿ÉÑ¡µÄÇÒ¿ÉÒÔ°´ÈÎÒâ˳ÐòÖ¸¶¨¡£Ê×ÏÈÖ¸¶¨¶¨Î»²ÎÊý¡£ÀýÈ磬ÕâÈý¸öÊôÐÔÊǵÈЧµÄ£º
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
[DllImport("user32.dll")]
µÚÒ»¸ö²ÎÊý£¨DLL Ãû³Æ£©ÊǶ¨Î»²ÎÊý²¢ÇÒ×ÜÊǵÚÒ»¸ö³öÏÖ£¬ÆäËû²ÎÊýΪÃüÃû²ÎÊý¡£ÔÚ´ËÀýÖУ¬Á½¸öÃüÃû²ÎÊý¶¼Ä¬ÈÏΪ¼Ù£¬Òò´ËËüÃÇ¿ÉÒÔÊ¡ÂÔ£¨ÓйØÄ¬ÈϲÎÊýÖµµÄÐÅÏ¢£¬Çë²Î¼û¸÷¸öÊôÐÔµÄÎĵµ£©¡£
ÔÚÒ»¸öÉùÃ÷ÖпÉÒÔ·ÅÖöà¸öÊôÐÔ£¬¿É·Ö¿ª·ÅÖã¬Ò²¿É·ÅÔÚͬһ×éÀ¨ºÅÖУº
bool AMethod([In][Out]ref double x);
bool AMethod([Out][In]ref double x);
bool AMethod([In,Out]ref double x);
ijЩÊôÐÔ¶ÔÓÚ¸ø¶¨ÊµÌå¿ÉÒÔÖ¸¶¨¶à´Î¡£´ËÀà¿É¶à´ÎʹÓõÄÊôÐÔµÄÒ»¸öʾÀýÊÇ Conditional£º
[Conditional("DEBUG"), Conditional("TEST1")] void TraceMethod() {...}
×¢Òâ ¸ù¾ÝÔ¼¶¨£¬ËùÓÐÊôÐÔÃû³Æ¶¼ÒÔµ¥´Ê¡°Attribute¡±½áÊø£¬ÒԱ㽫ËüÃÇÓë .NET Framework ÖÐµÄÆäËûÏîÇø·Ö¡£µ«ÊÇ£¬ÔÚ´úÂëÖÐʹÓÃÊôÐÔʱ²»ÐèÒªÖ¸¶¨ÊôÐÔºó׺¡£ÀýÈ磬[DllImport] ËäµÈЧÓÚ [DllImportAttribute]£¬µ« DllImportAttribute ²ÅÊǸÃÊôÐÔÔÚ .NET Framework ÖеÄʵ¼ÊÃû³Æ¡£
ָʾÈçºÎÔÚÍйܴúÂëºÍ·ÇÍйܴúÂëÖ®¼ä·âËÍÊý¾Ý¡£¿É½«¸ÃÊôÐÔÓ¦ÓÃÓÚ²ÎÊý¡¢×ֶλò·µ»ØÖµ¡£
¸ÃÊôÐÔΪ¿ÉÑ¡ÊôÐÔ£¬ÒòΪÿ¸öÊý¾ÝÀàÐͶ¼ÓÐĬÈϵķâËÍ´¦ÀíÐÐΪ¡£
´ó¶àÊýÇé¿öÏ£¬¸ÃÊôÐÔÖ»ÊÇʹÓà UnmanagedType ö¾Ù±êʶ·ÇÍйÜÊý¾ÝµÄ¸ñʽ¡£
ÀýÈ磬ĬÈÏÇé¿öÏ£¬¹«¹²ÓïÑÔÔËÐп⽫×Ö·û´®²ÎÊý×÷Ϊ BStr ·âË͵½ COM ·½·¨£¬µ«ÊÇ¿ÉÒÔͨ¹ýÖÆ¶¨MarshalAsÊôÐÔ£¬½«×Ö·û´®×÷Ϊ LPStr¡¢LPWStr¡¢LPTStr »ò BStr ·âË͵½·ÇÍйܴúÂ롣ijЩ UnmanagedType ö¾Ù³ÉÔ±ÐèÒª¸½¼ÓÐÅÏ¢¡£
Èý£º½ø½×£¬ÈçºÎ´¦Àíº¬Óи´ÔӵIJÎÊýºÍ·µ»ØÖµÀàÐ͵ÄAPIµÄµ÷Óã¨To Be Continue¡£©
²Î¿¼ÎÄÕÂ
±¾Îijö×Ô ¡°ï±ÈËKris¡± ²©¿Í£¬ÇëÎñ±Ø±£Áô´Ë³ö´¦http://chris.blog.51cto.com/112473/29285