c#

位置:IT落伍者 >> c# >> 浏览文章

C#实现动态调用Windows DLL


发布日期:2024年04月23日
 
C#实现动态调用Windows DLL

部分代码来自于网络废话不多说上代码

调用方法

object obj = WinDllInvoke(Kerneldll Beep new object[] { } typeof(void));

函数代码

[SystemRuntimeInteropServicesDllImport(kernel)]

private static extern IntPtr LoadLibrary(string lpLibFileName);

[SystemRuntimeInteropServicesDllImport(kernel)]

private static extern IntPtr GetProcAddress(IntPtr hModule string lpProcName);

[SystemRuntimeInteropServicesDllImport(kernel)]

private static extern IntPtr FreeLibrary(IntPtr hLibModule);

///

/// 动态调用Windows DLL

///

/// Dll文件名

/// 待调用的函数名

/// 函数参数

/// 返回值

/// 调用结果

private static object WinDllInvoke(string fileName string funName object[] objParams Type returnType)

{

IntPtr libHandle = IntPtrZero;

try

{

//获取函数地址

libHandle = LoadLibrary(fileName);

if (libHandle == IntPtrZero) return null;

IntPtr procAddres = GetProcAddress(libHandle funName);

if (procAddres == IntPtrZero) return null;

//获取参数类型

Type[] paramTypes = new Type[objParamsLength];

for (int i = ; i < objParamsLength; ++i)

{

paramTypes[i] = objParams[i]GetType();

}

//构建调用方法模型

AssemblyName asembyName = new AssemblyName();

asembyNameName = WinDllInvoke_Assembly;

AssemblyBuilder asembyBuilder = AppDomainCurrentDomainDefineDynamicAssembly(asembyName AssemblyBuilderAccessRun);

ModuleBuilder moduleBuilder = asembyBuilderDefineDynamicModule(WinDllInvoke);

MethodBuilder methodBuilder = moduleBuilderDefineGlobalMethod(InvokeFun MethodAttributesPublic | MethodAttributesStatic returnType paramTypes);

//获取一个 ILGenerator 用于发送所需的 IL

ILGenerator IL = methodBuilderGetILGenerator();

for (int j = ; j < paramTypesLength; ++j)

{

//将参数压入堆栈

if (paramTypes[j]IsValueType)

{

ILEmit(OpCodesLdarg j); //By Value

}

else

{

ILEmit(OpCodesLdarga j); //By Addrsss

}

}

// 判断处理器类型

if (IntPtrSize == )

{

ILEmit(OpCodesLdc_I procAddresToInt());

}

else if (IntPtrSize == )

{

ILEmit(OpCodesLdc_I procAddresToInt());

}

else

{

throw new PlatformNotSupportedException(不好意思

偶不认得你哦!);

}

ILEmitCalli(OpCodesCalli CallingConventionStdCall returnType paramTypes);

ILEmit(OpCodesRet); // 返回值

moduleBuilderCreateGlobalFunctions();

// 取得方法信息

MethodInfo methodInfo = moduleBuilderGetMethod(InvokeFun);

return methodInfoInvoke(null objParams);// 调用方法并返回其值

}

catch { return null; }

finally

{

if (libHandle != IntPtrZero) FreeLibrary(libHandle); //释放资源

}

}

               

上一篇:在.NET中利用XMLHTTP下载文件

下一篇:使用C#返回系统特殊路径