zoukankan      html  css  js  c++  java
  • C#动态地调用Win32 DLL中导出的函数

    关于这种C#中调用Win32 DLL中导出的函数的方法有很多种了,本文做个小结。

    大致有两种情况:

    1. 编译时已知DLL文件名和函数名
    2. 运行时才能获知DLL文件名(函数名)

    编译时已知DLL文件名

    这种情况下可以简单的使用Pinvoke机制,使用DllImport如:

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]

    public static extern bool Beep(uint freq,uint time);

    运行时才能获知DLL文件名

    有两种解决方案:

    • 首先,可以想到使用Win32 API中LoadLibrary和GetProcAddress,象在C/C++中一样来动态调用DLL中函数,这里就不细说了;
    • 其次,考虑如何才能动态使用DllImport, 很容易想到使用.Net中的反射(Reflection&Emit)来动态生成一个Pinvoke函数,如下例:

        

    代码
    1 /// <summary>
    2 /// 获取DLL中函数
    3 /// </summary>
    4 /// <param name="dllName">DLL文件的名字(路径),如果在PATH环境变量下或当期目录中则可以直接指定DLL的名字,否则应包括其路径信息</param>
    5 /// <param name="methodName">函数名字</param>
    6 /// <param name="returnType">返回类型</param>
    7 /// <param name="paramTypes">参数类型,如果无参数则为null</param>
    8 /// <param name="declareCallingConvertions">生成的函数的调用约定</param>
    9 /// <param name="nativeCallingConvertions">DLL函数的调用约定</param>
    10 /// <param name="nativeCharSet">字符集</param>
    11 /// <returns>代表指定DLL中指定函数的MethodInfo,是一个静态方法</returns>
    12   public static MethodInfo GetMethodInfoInDll(string dllName, string methodName,
    13 Type returnType, Type[] paramTypes,
    14 CallingConventions declareCallingConvertions,
    15 System.Runtime.InteropServices.CallingConvention nativeCallingConvertions,
    16 System.Runtime.InteropServices.CharSet nativeCharSet)
    17 {
    18 AssemblyName assemblyName=new AssemblyName("Assembly"+Environment.TickCount);
    19 AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Run);
    20 ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);
    21
    22 MethodInfo method = moduleBuilder.DefinePInvokeMethod(methodName, dllName,
    23 MethodAttributes.PinvokeImpl | MethodAttributes.Static | MethodAttributes.Public,
    24 declareCallingConvertions, returnType, paramTypes,
    25 nativeCallingConvertions, nativeCharSet);
    26
    27
    28 moduleBuilder.CreateGlobalFunctions();
    29
    30 MethodInfo methodInfo = moduleBuilder.GetMethod(methodName,paramTypes);
    31
    32 return methodInfo;
    33
    34 }
    35  

    当然,适应于第二中情况的解决方案也适应于第一中情况。

  • 相关阅读:
    MySQL主从复制(异步复制与半同步复制)
    http和https到底区别在哪
    Tcp的Flags
    机器学习之近邻算法模型(KNN)
    机器学习之linear_model (线性回归算法模型)
    数据分析之Pandas操作
    数据分析之Numpy的基本操作
    分布式爬虫
    基于CrawlSpider全栈数据爬取
    HDU-4687 Boke and Tsukkomi 带花树,枚举
  • 原文地址:https://www.cnblogs.com/pcy0/p/CSharp_dynamic_invoke_native_dll_function_exported.html
Copyright © 2011-2022 走看看