创建实例&调用程序集的静态Main

时间:2017-05-12 13:06:20

标签: c# .net-assembly invoke createinstance

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

Heres是程序集的代码(.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抛出异常。

2 个答案:

答案 0 :(得分:5)

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

因此,如果您打算创建Main类的实例,则应该获得该方法的DeclaringType

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

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

method.Invoke(null, null);

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

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

答案 1 :(得分:4)

您无法创建方法的实例,只需调用它:

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