最近一直在找工作,各种笔试面试,各种讨价还价,着实累的不行。不过幸好在这些奔波的日子里能学到不少东西,也明白了自己的不足,更加重要的是让自己明白了做技术挺适合自己。
今天通过一个小的例子来总结C#如何调用系统API的。例子很小,主要解决的是控制台输出(console.write这个方法在打印一定量数据的时候会罢工)的一个帮助类。
下面直接上代码进行说明:
/// <summary> /// 解决Console.Write写大量字符串异常 /// </summary> public sealed class ConsoleHelper { public static IntPtr OutHandle { get { if (outHandle == IntPtr.Zero) outHandle = GetStdHandle(StdHandle.STD_OUTPUT_HANDLE); return outHandle; } } public static void Write(string value) { if (OutHandle == IntPtr.Zero) return; int numberOfCharsWritten; char[] valueArray = value.ToCharArray(); WriteConsole(outHandle, valueArray, System.Text.Encoding.GetEncoding("GB2312").GetBytes(value).Length, out numberOfCharsWritten, 0); } public static void Write(string format, params Object[] arg) { Write(string.Format(format, arg)); } public static void WriteLine(string value) { Write(value + Environment.NewLine); } public static void WriteLine(string format, params Object[] arg) { Write(format + Environment.NewLine, arg); } enum StdHandle { STD_INPUT_HANDLE = -10, STD_OUTPUT_HANDLE = -11, STD_ERROR_HANDLE = -12 } [System.Runtime.InteropServices.DllImport("Kernel32.dll")] static extern IntPtr GetStdHandle(StdHandle nStdHandle); [System.Runtime.InteropServices.DllImport("Kernel32.dll")] static extern int WriteConsole( IntPtr hConsoleOutput, char[] lpBuffer, int nNumberOfCharsToWrite, out int lpNumberOfCharsWritten, int lpReserved ); static IntPtr outHandle = IntPtr.Zero; }
从上面的代码,我们可以发现调用系统的API基本有以下几个步骤:
1、找到你需要的系统API,并从中找到你需要的方法。上面的API是“Kernel32.dll“,需要的方法是static extern int WriteConsole(para1,para2,para3,para4)。
2、引用你的系统API([System.Runtime.InteropServices.DllImport("Kernel32.dll")]),构建你的方法参数(因为系统API中的方法只能识别它本身封装好的参数)。
在上面的例子中我们自定义了一个枚举,并引用了另一个系统方法,目的是构造我们需要方法的参数。
3、同调用任何方法一样调用我们引用的方法。