动态调用 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);
}
}
}
说这么多,代码才是最实在的 :
分享到:
相关推荐
我稍加修改了代码,以便可以使用所有.NET版本进行编译。使用.NET2和3.5时,标准方法和动态方法之间的执行时间没有差异,在释放模式下两者都大约需要1400-1500ms。然而.NET 4 (v4.0.30319)是一个不同的故事...
用法在调试器中暂停时,选择MethodBase子类的实例(例如DynamicMethod , MethodBuilder , ConstructorBuilder ,...),然后启动可视化工具: 有两种使用此可视化器的方法。IL Visualizer(模态) 选择“ IL ...
软件说明: .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)(已测试) ...
1. **创建DynamicMethod**:首先,需要创建一个`DynamicMethod`对象,提供方法名、返回类型、参数类型等信息。 2. **获取ILGenerator**:然后,通过`DynamicMethod`的`GetILGenerator()`方法获取ILGenerator实例。 3...
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...
var dynamicMethod = new DynamicMethod("Add", typeof(int), new[] { typeof(int), typeof(int) }); var il = dynamicMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); // 加载第一个参数 il.Emit(OpCodes...
dynamicMethod.Statements.Add(new CodeSnippetStatement("Console.WriteLine(\"Hello, World!\");")); dynamicClass.Members.Add(dynamicMethod); codeNamespace.Types.Add(dynamicClass); CodeCompileUnit ...
在`Main`方法中,我们创建了一个`MyDelegate`类型的动态变量`dynamicMethod`,然后将其绑定到`Hello`方法上。通过`dynamic`关键字,我们可以不指定具体的委托实例,而是直接在运行时确定要调用的方法。`Hello`方法将...
Method method = clazz.getMethod("dynamicMethod", String.class); // 3. 创建对象(假设DynamicClass有无参构造器) Object instance = clazz.getDeclaredConstructor().newInstance(); // 4. 调用方法 ...
5. **ILGenerator**和`DynamicMethod`:对于更高级的动态组件生成,可以使用`System.Reflection.Emit`命名空间,其中的`ILGenerator`类允许我们直接生成中间语言(IL)代码,而`DynamicMethod`则用于创建和执行这些...
2. **动态方法(DynamicMethod)与IL注入**:C#允许通过`System.Reflection.Emit`命名空间创建动态方法,这在hook中用于生成新的函数实现,可以用来在运行时修改方法的行为。 3. **P/Invoke**:如果被hook的函数是 ...
DynamicMethod dynMethod = new DynamicMethod("_", objtype, null); ILGenerator ilGen = dynMethod.GetILGenerator(); ilGen.Emit(OpCodes.Newobj, objtype.GetConstructor(Type.EmptyTypes)); ...
Method method = dynamicClass.getMethod("dynamicMethod", ...); method.invoke(instance, ...); ``` 五、注意事项 1. 权限:在AndroidManifest.xml中添加`...
在这个实例中,可能通过`DynamicMethod`、`ILGenerator`等类来构建和执行动态生成的IL代码,以实现更高效的对象创建或依赖解析逻辑。 结合反射和Emit,我们可以创建一个高度定制的容器,它不仅能根据配置或元数据...
2. **动态方法调用**:`DynamicQueryable`库的核心是`DynamicMethod`类,它允许在运行时创建并执行方法。`DynamicQueryable`通过解析传入的字符串查询条件,生成对应的`Expression`对象,并最终转换成可执行的Lambda...
- 动态方法调用:OGNL允许动态调用对象的方法,如`${object.dynamicMethod()}`,这增强了框架的灵活性。 3. OGNL的安全问题: 由于OGNL的强大功能,如果不进行适当的输入验证和过滤,可能会导致OGNL注入攻击。...
2. **动态方法(DynamicMethod)**:另一种方法是使用`System.Reflection.Emit`命名空间,创建动态方法来直接操作IL。动态方法允许我们在运行时创建方法,可以直接操作内存,从而达到较高的性能。不过,这种方法需要...
攻击者可能会使用一些开源的JIT库,如.NET的DynamicMethod或JavaScript的V8引擎,来生成和执行代码。 - `advanced_shellcode`:这个名字暗示了一个更为高级的shellcode实现,可能涉及到更复杂的内存操作、混淆技巧...
C#中,可以使用动态代理(如System.Reflection.Emit命名空间下的DynamicMethod)或者接口实现静态代理,用于添加额外的功能或者控制访问权限。 7. 适配器模式(Adapter Pattern):适配器模式使两个不兼容的接口...
- System.Proxy中的DynamicMethod和Delegate类也可以帮助构建动态代理,用于实现拦截器和AOP。 通过理解并熟练运用代理模式,开发者可以更好地设计和重构系统,提高代码的可维护性和扩展性。在C#中,代理模式的...