.net调用windowsAPI的总结

      最近一直在找工作,各种笔试面试,各种讨价还价,着实累的不行。不过幸好在这些奔波的日子里能学到不少东西,也明白了自己的不足,更加重要的是让自己明白了做技术挺适合自己。

今天通过一个小的例子来总结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;
    }
View Code

 从上面的代码,我们可以发现调用系统的API基本有以下几个步骤:

1、找到你需要的系统API,并从中找到你需要的方法。上面的API是“Kernel32.dll“,需要的方法是static extern int WriteConsole(para1,para2,para3,para4)。

2、引用你的系统API([System.Runtime.InteropServices.DllImport("Kernel32.dll")]),构建你的方法参数(因为系统API中的方法只能识别它本身封装好的参数)。

     在上面的例子中我们自定义了一个枚举,并引用了另一个系统方法,目的是构造我们需要方法的参数。

3、同调用任何方法一样调用我们引用的方法。

原文地址:https://www.cnblogs.com/liehuochongsheng/p/4499491.html