从内存运行.NET可执行文件时遇Parameter count mismatch问题的解决咨询
解决.NET程序集内存加载时的
TargetParameterCountException问题 你在内存运行.NET可执行文件时遇到的System.Reflection.TargetParameterCountException,本质是入口方法的参数传递不匹配导致的,我来帮你拆解问题和解决方案:
问题根源
你的测试样本是无参数的简易控制台程序(比如直接打印字符串),它的入口Main方法不带参数,所以method.Invoke(o, null)能正常工作。但很多正规.NET程序(比如标准控制台应用)的入口方法是static void Main(string[] args)——需要接收一个字符串数组参数,这时候你传入null就会因为参数数量不对抛出异常。
另外你之前的代码里用a.CreateInstance(method.Name)创建实例是多余的,因为绝大多数.NET程序的入口方法都是静态方法,静态方法不需要实例就能调用,直接传null就行。
要排查的几个关键点
- 先确认目标程序的入口方法参数:用
method.GetParameters()查看参数列表,判断是否需要传入参数 - 检查入口方法的类型:通过
method.IsStatic判断是否为静态方法,静态方法不需要实例对象 - 后续扩展注意:如果是依赖其他程序集的大型文件,还要确保依赖的程序集能被正确加载(不过当前异常和这个无关,是参数问题)
修复后的可用代码
FileStream fs = new FileStream(@"EverySample.exe", FileMode.Open); BinaryReader br = new BinaryReader(fs); byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length)); fs.Close(); br.Close(); Assembly a = Assembly.Load(bin); MethodInfo method = a.EntryPoint; if (method == null) return; // 根据入口方法的参数数量动态准备参数 object[] parameters = method.GetParameters().Length == 0 ? null : new object[] { new string[0] }; // 静态方法直接传入null作为实例参数 method.Invoke(null, parameters);
额外优化建议
你可以用using语句自动释放文件流资源,避免手动关闭可能遗漏的问题:
using (FileStream fs = new FileStream(@"EverySample.exe", FileMode.Open)) using (BinaryReader br = new BinaryReader(fs)) { byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length)); Assembly a = Assembly.Load(bin); MethodInfo method = a.EntryPoint; if (method == null) return; object[] parameters = method.GetParameters().Length == 0 ? null : new object[] { new string[0] }; method.Invoke(null, parameters); }
内容的提问来源于stack exchange,提问作者dewina thrice
相关产品推荐
相关产品推荐

