zoukankan      html  css  js  c++  java
  • C# 动态调用DLL

    本来是想实现控制台程序运行时自动全屏,但是只找到VC下的实现方法(http://www.vckbase.com/bbs/prime/viewprime.asp?id=347)。

    其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress和Freelibrary。步骤如下:

    1.   Loadlibrary: 装载指定DLL动态库

    2.   GetProcAddress:获得函数的入口地址

    3.   Freelibrary: 从内存中卸载动态库

    但是C#中是没有函数指针,无法直接使用GetProcAddress返回的入口地址。后来找到资料,其实.NET 2.0新增了Marshal.GetDelegateForFunctionPointer 方法可以满足这个要求,MSDN里的解释是:将非托管函数指针转换为委托。

    后面的事就简单啦,我把它编成了一个类来方便调用。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;

    namespace feiyun0112.cnblogs.com
    {
        public class DllInvoke
        {

            Win API

            private IntPtr hLib;        
            public DllInvoke(String DLLPath)
            {
                hLib = LoadLibrary(DLLPath);
            }


            ~DllInvoke()
            {
                FreeLibrary(hLib);            
            }


            //将要执行的函数转换为委托
            public Delegate Invoke (string APIName,Type t)  
            {
                IntPtr api = GetProcAddress(hLib, APIName);
                return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
            }


        }

    }


    下面是使用的例子:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using feiyun0112.cnblogs.com;

    namespace ConsoleApplication1
    {
        class Program
        {
            Win API

            public delegate bool SetConsoleDisplayMode(IntPtr hOut, int dwNewMode, out int lpdwOldMode);

            static void Main(string[] args)
            {
                DllInvoke dll = new DllInvoke("kernel32.dll");
                
                int dwOldMode;

                //标准输出句柄
                IntPtr hOut = GetStdHandle(STD_OUTPUT_HANDLE);
                
                //调用Win API,设置屏幕最大化
                SetConsoleDisplayMode s = (SetConsoleDisplayMode)dll.Invoke("SetConsoleDisplayMode", typeof(SetConsoleDisplayMode));
                s(hOut, 1, out dwOldMode);

                Console.WriteLine("********************Full Screen Mode********************");
                Console.ReadLine();
               
            }

        }

    }

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/lizi/p/2363090.html
Copyright © 2011-2022 走看看