`

DynamicMethod

    博客分类:
  • .NET
阅读更多
动态调用 Win32 Function(API)

动态调用Win32 Function(API)

  在很多场合,我们需要动态进行平台调用。
  .Net 平台下不同于 Win32,无法直接通过函数指针调用函数,并且对于 DLL 也只能事先声明函数签名后才能调用。

  下面是动态平台调用的解决方案
  1.通过 Win32 DLL 进行平台调用
    缺点 : 无法和.Net进行交互。
    参看 : 无

  2.通过定义动态程序集声明函数签名并反射调用平台调用
    缺点 : 效率低下,资源占用过大,并且无法释放动态程序集所占用的资源,如果使用AppDomain,虽然可以释放动态程序集,但是却会占用更多资源。
    参看 : 无

  3.通过定义动态程序集生成全局方法,在全局方法中使用 MSIL 指令调用函数指针。
    缺点 : 除了效率可以接受外,其他缺点同上。
    参看 : http://blog.csdn.net/pansiom/archive/2006/01/01/568096.aspx

  4.使用 System.Runtime.InteropServices.Marshal类的GetDelegateForFunctionPointer方法根据委托来动态调用函数指针
    缺点 : 必须现定义好委托才可以调用函数指针,失去了"动态"的效果
    参看 : http://www.cnblogs.com/rick/archive/2006/07/13/449849.aspx

  5.在 DynamicMethod 中使用 MSIL 指令调用函数指针
    缺点 : 几乎没有
    参看 : 本文内容

  在这里,我们就是使用 DynamicMethod 来完成动态平台调用,他的好处主要有以下几个:
  1.轻量:占用很少的资源,当不使用 DynamicMethod 时,可以释放资源。
  2.效率:IronPython 何以比 CPython 高效?就是因为借助了 DynamicMethod 和 JIT。
  3.灵活:你几乎可以使动态调用任何定义的Win32 Function,无论是调用约定不同还是参数中有结构。

  MSDN中对 DynamicMethod 的描述:
    可以使用 DynamicMethod 类在运行时生成和执行方法,而不必生成动态程序集和动态类型来包含该方法。动态方法是生成和执行少量代码的最有效方式。

实例代码:
using System;
using System.Collections.Generic;
using System.Text;
using Zealic.Windows;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //测试1
            DynamicLibrary hilib = new DynamicLibrary("hi.dll");
            NativeMethodBuilder hiBuilder = new NativeMethodBuilder();
            NativeMethod method = hiBuilder.MakeMethod(hilib, "func");
            Console.WriteLine("请关闭弹出的对话框 'Hille'");
            method.Invoke();
            hilib.Free();

            //测试2
            DynamicLibrary krnlib = new DynamicLibrary("kernel32.dll");
            NativeMethodBuilder beepBuilder = new NativeMethodBuilder();
            beepBuilder.ParameterLength = 2;
            beepBuilder.SetParameterInfo(0, typeof(int));
            beepBuilder.SetParameterInfo(1, typeof(int));
            method = beepBuilder.MakeMethod(krnlib,"Beep");
            Console.WriteLine("听,你的机器在尖叫!");
            method.Invoke(1000, 1000);
            Console.WriteLine("按任意键退出!");
            Console.ReadKey(true);
        }
    }
}



  说这么多,代码才是最实在的 :
分享到:
评论

相关推荐

    无法弄清楚为什么此DynamicMethod比本地c#方法要慢得多。

    我稍加修改了代码,以便可以使用所有.NET版本进行编译。使用.NET2和3.5时,标准方法和动态方法之间的执行时间没有差异,在释放模式下两者都大约需要1400-1500ms。然而.NET 4 (v4.0.30319)是一个不同的故事...

    il-visualizer:.NET调试可视化工具,用于VS2017和VS2015的运行时生成的IL代码(通过DynamicMethod等)

    用法在调试器中暂停时,选择MethodBase子类的实例(例如DynamicMethod , MethodBuilder , ConstructorBuilder ,...),然后启动可视化工具: 有两种使用此可视化器的方法。IL Visualizer(模态) 选择“ IL ...

    脱壳工具 JitDumper

    软件说明: .NET Framework 4.8(x86 和 x64)(已测试) .NET Core 1(x86 和 x64)(未测试) .NET Core 2(x86 和 x64)(未测试) .NET Core 3(x86 和 x64)(已测试) .NET 5(x86 和 x64)(已测试) ...

    Emit学习之旅

    1. **创建DynamicMethod**:首先,需要创建一个`DynamicMethod`对象,提供方法名、返回类型、参数类型等信息。 2. **获取ILGenerator**:然后,通过`DynamicMethod`的`GetILGenerator()`方法获取ILGenerator实例。 3...

    使用InlineIL实现具有通用类型参数的高性能ReadProcessMemory和WriteProcessMemory.zip

    DynamicMethod dm = new DynamicMethod($"Read_{typeof(T).Name}", typeof(T), Type.EmptyTypes); ILGenerator il = dm.GetILGenerator(); // 将字节数组转换为T类型 for (int i = 0; i ; i++) { il.Emit...

    emit 类库 流畅api

    var dynamicMethod = new DynamicMethod("Add", typeof(int), new[] { typeof(int), typeof(int) }); var il = dynamicMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); // 加载第一个参数 il.Emit(OpCodes...

    “在c#编写的软件中动态地编译新的代码”对应的源码下载

    dynamicMethod.Statements.Add(new CodeSnippetStatement("Console.WriteLine(\"Hello, World!\");")); dynamicClass.Members.Add(dynamicMethod); codeNamespace.Types.Add(dynamicClass); CodeCompileUnit ...

    动态委托的小例子(HelloWorld)

    在`Main`方法中,我们创建了一个`MyDelegate`类型的动态变量`dynamicMethod`,然后将其绑定到`Hello`方法上。通过`dynamic`关键字,我们可以不指定具体的委托实例,而是直接在运行时确定要调用的方法。`Hello`方法将...

    反射,动态加载指定类调用类中的方法

    Method method = clazz.getMethod("dynamicMethod", String.class); // 3. 创建对象(假设DynamicClass有无参构造器) Object instance = clazz.getDeclaredConstructor().newInstance(); // 4. 调用方法 ...

    用Visual C#动态生成组件

    5. **ILGenerator**和`DynamicMethod`:对于更高级的动态组件生成,可以使用`System.Reflection.Emit`命名空间,其中的`ILGenerator`类允许我们直接生成中间语言(IL)代码,而`DynamicMethod`则用于创建和执行这些...

    C#hook代码如下地图文件

    2. **动态方法(DynamicMethod)与IL注入**:C#允许通过`System.Reflection.Emit`命名空间创建动态方法,这在hook中用于生成新的函数实现,可以用来在运行时修改方法的行为。 3. **P/Invoke**:如果被hook的函数是 ...

    号称.Net下最快的json组件fastJSON.zip

     DynamicMethod dynMethod = new DynamicMethod("_", objtype, null);  ILGenerator ilGen = dynMethod.GetILGenerator();  ilGen.Emit(OpCodes.Newobj, objtype.GetConstructor(Type.EmptyTypes));  ...

    android 动态加载jar代码

    Method method = dynamicClass.getMethod("dynamicMethod", ...); method.invoke(instance, ...); ``` 五、注意事项 1. 权限:在AndroidManifest.xml中添加`...

    该实例是简单通过反射和Emit实现的一个容器 (IL)

    在这个实例中,可能通过`DynamicMethod`、`ILGenerator`等类来构建和执行动态生成的IL代码,以实现更高效的对象创建或依赖解析逻辑。 结合反射和Emit,我们可以创建一个高度定制的容器,它不仅能根据配置或元数据...

    DynamicQueryable基于Linq的动态查询示例

    2. **动态方法调用**:`DynamicQueryable`库的核心是`DynamicMethod`类,它允许在运行时创建并执行方法。`DynamicQueryable`通过解析传入的字符串查询条件,生成对应的`Expression`对象,并最终转换成可执行的Lambda...

    struts2中的ognl.jar

    - 动态方法调用:OGNL允许动态调用对象的方法,如`${object.dynamicMethod()}`,这增强了框架的灵活性。 3. OGNL的安全问题: 由于OGNL的强大功能,如果不进行适当的输入验证和过滤,可能会导致OGNL注入攻击。...

    不使用反射进行C#属性的运行时动态访问

    2. **动态方法(DynamicMethod)**:另一种方法是使用`System.Reflection.Emit`命名空间,创建动态方法来直接操作IL。动态方法允许我们在运行时创建方法,可以直接操作内存,从而达到较高的性能。不过,这种方法需要...

    jit spray source code

    攻击者可能会使用一些开源的JIT库,如.NET的DynamicMethod或JavaScript的V8引擎,来生成和执行代码。 - `advanced_shellcode`:这个名字暗示了一个更为高级的shellcode实现,可能涉及到更复杂的内存操作、混淆技巧...

    C#设计模式C#设计模式C#设计模式

    C#中,可以使用动态代理(如System.Reflection.Emit命名空间下的DynamicMethod)或者接口实现静态代理,用于添加额外的功能或者控制访问权限。 7. 适配器模式(Adapter Pattern):适配器模式使两个不兼容的接口...

    C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) (Level 300)

    - System.Proxy中的DynamicMethod和Delegate类也可以帮助构建动态代理,用于实现拦截器和AOP。 通过理解并熟练运用代理模式,开发者可以更好地设计和重构系统,提高代码的可维护性和扩展性。在C#中,代理模式的...

Global site tag (gtag.js) - Google Analytics