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

Jul*_*ian -7 c# createinstance invoke .net-assembly

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

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

namespace Test
{ 
    internal static class Program
    {

        [STAThread]
        private static void Main(string[] args)
Run Code Online (Sandbox Code Playgroud)

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

Assembly asm = Assembly.Load(bin); 
MethodInfo method = asm.EntryPoint;
object obj = asm.CreateInstance(method.ToString());
method.Invoke(obj, null);
Run Code Online (Sandbox Code Playgroud)

由于参数不匹配,obj始终为null并且Invoke抛出异常.

Pat*_*man 5

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

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

object obj = asm.CreateInstance(method.DeclaringType.ToString());
Run Code Online (Sandbox Code Playgroud)

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

method.Invoke(null, null);
Run Code Online (Sandbox Code Playgroud)

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

object[] parameters = new object[] { new string[] { "","" } };
method.Invoke(null, parameters);
Run Code Online (Sandbox Code Playgroud)