【问题标题】:Create Instance & Invoke static Main of an assembly创建实例并调用程序集的静态 Main
【发布时间】:2017-10-11 19:42:21
【问题描述】:

我在创建静态 void Main() 程序集的实例时遇到问题。

这是程序集的代码(.NET Exe)

namespace Test
{ 
    internal static class Program
    {

        [STAThread]
        private static void Main(string[] args)

这是启动器代码: bin 是一个字节数组,其中包含我从文件中读取的程序集。

Assembly asm = Assembly.Load(bin); 
MethodInfo method = asm.EntryPoint;
object obj = asm.CreateInstance(method.ToString());
method.Invoke(obj, null);

obj 总是 null 并且 Invoke 因为参数不匹配抛出异常。

【问题讨论】:

    标签: c# .net-assembly invoke createinstance


    【解决方案1】:

    可执行文件的入口点是方法,方法没有实例,类有。

    所以如果你打算创建Main类的实例,你应该得到方法的DeclaringType

    object obj = asm.CreateInstance(method.DeclaringType.ToString());
    

    但在这种情况下这是没有用的,因为静态方法没有调用它的实例,所以您只需省略实例即可:

    method.Invoke(null, null);
    

    如果要使用参数调用方法,请确保在对象数组中为每个参数输入一个条目:

    object[] parameters = new object[] { new string[] { "","" } };
    method.Invoke(null, parameters);
    

    【讨论】:

    • 如果我调用 method.Invoke(null, null);它抛出一个异常:参数计数不匹配如果我调用 object[] args = { new string[] { "", "" } };方法.Invoke(null, args);它抛出:调用的目标已导致异常。
    • 最后一个错误意味着另一端出了点问题。调试那个程序。
    【解决方案2】:

    您不能创建方法的实例,只需调用它即可:

    Assembly asm = Assembly.Load(bin); 
    MethodInfo method = asm.EntryPoint;
    method.Invoke(null, new[] { myParams });
    

    由于main 是一个静态方法,因此您不需要类的实例。这就是为什么Invoke 的第一个参数是null。然而,第二个参数是传递给main 的参数列表,因此在您的情况下,它类似于new object[] { new string[] { "firstArg", "secondArg" } },或者如果您不提供任何参数,只需null

    【讨论】:

    • 但它不适用于参数 null。它得到异常:参数计数不匹配
    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2015-09-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多