2017-05-12 3 views
-7

Je rencontre un problème lors de la création d'une instance d'un assembly d'un void statique Main().Create Instance & Invoke static Main d'un assembly

Heres est le code de l'Assemblée (Exe .NET)

namespace Test 
{ 
    internal static class Program 
    { 

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

Et voici le code du lanceur: bin est un tableau d'octets qui contient mon assemblage lecture du fichier.

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

obj est toujours nul et Invoke émet une exception en raison de la disparité des paramètres.

Répondre

4

Vous ne pouvez pas créer une instance d'une méthode, appelez simplement:

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

Comme main est une méthode statique, vous ne pas besoin d'une instance de votre classe. C'est pourquoi le premier argument à Invoke est . Le deuxième argument est cependant la liste des paramètres passés à main, donc dans votre cas, c'est quelque chose comme new object[] { new string[] { "firstArg", "secondArg" } } ou si vous ne fournissez pas d'arguments simplement null.

+0

Ok c'est clair pour moi, merci. – Julian

+0

Mais cela ne fonctionne pas avec l'argument null. Il obtient une exception: non-concordance des comptes – Julian

5

Le point d'entrée d'un exécutable est une méthode et les méthodes n'ont pas d'instances, ce que font les classes.

Donc, si vous avez l'intention de créer une instance de la classe Main, vous devriez obtenir le DeclaringType de la méthode:

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

Mais dans ce cas est inutile, car une méthode statique ne dispose pas d'un par exemple, il est appelé, donc en omettant l'instance est tout ce que vous avez à faire:

method.Invoke(null, null); 

Si vous voulez appeler la méthode avec des paramètres, assurez-vous de faire une entrée par l'argument dans le tableau d'objet:

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

Si j'appelle method.Invoke (null, null); il lance une exception: non-concordance des paramètres Si j'appelle object [] args = {new string [] {"", ""}}; method.Invoke (null, args); il lance: la cible d'un appel a provoqué une exception. – Julian

+1

La dernière erreur signifie que quelque chose s'est mal passé à l'autre bout. Déboguez ce programme. –