部分代码来自于网络废话不多说上代码
调用方法
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); //释放资源
}
}