PowerShell反射调用测试DLL静态void函数的参数传递报错问题
错误原因
- 程序集加载逻辑错误:你使用的
[System.Reflection.Assembly]::Load方法接收的入参是程序集原始字节数组,而非本地文件路径,加载本地DLL请使用LoadFrom方法;同时你第一行代码存在语法笔误,字符串首尾引号不匹配。 - 反射调用参数格式错误:
MethodInfo.Invoke的第二个入参要求为object[]类型的参数数组,即使目标方法仅需1个参数,也必须将参数封装为数组传入。你直接传入字符串会被识别为参数数量不匹配,传入$null时方法拿到的参数为空,所以进程启动失败静默退出。
修正后可运行代码
# 加载DLL文件,改用LoadFrom方法 $assem = [System.Reflection.Assembly]::LoadFrom("C:\temp\mytestlib.dll") $class = $assem.GetType("ExampleProject.Class1") $method = $class.GetMethod("RunProcess") $fullName = "C:\\Windows\\System32\\calc.exe" # 参数必须包裹为object数组 $method.Invoke($null, @($fullName))
可选实现说明
如果你确实需要使用Load方法加载程序集,需要先读取DLL的字节内容再传入,示例如下:
$dllBytes = [System.IO.File]::ReadAllBytes("C:\temp\mytestlib.dll") $assem = [System.Reflection.Assembly]::Load($dllBytes) # 后续获取类型、调用方法的逻辑和上述代码一致
内容的提问来源于stack exchange,提问作者Psymon25
相关产品推荐
相关产品推荐

