You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从内存运行.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:58:59