2017-05-12 9 views
-7

静的void Main()のアセンブリのインスタンスを作成する際に問題があります。インスタンスの作成と静的アセンブリのメイン

相続人は、アセンブリ(.NETエグゼ)のコード

namespace Test 
{ 
    internal static class Program 
    { 

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

であり、ここでランチャーコードは次のとおりです。 ビンは、ファイルから読み込ん私のアセンブリが含まれていたバイトの配列です。

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

objは常にnullであり、パラメーターが一致しないためにInvokeが例外をスローします。

答えて

4

あなたはそれを呼び出し、メソッドのインスタンスを作成しますcan't:mainとして

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

あなたはドント静的メソッドは、クラスのインスタンスが必要です。このため、Invokeの最初の引数はnullです。しかし、2番目の引数はmainに渡されるパラメータのリストなので、あなたの場合はnew object[] { new string[] { "firstArg", "secondArg" } }のようなものか、単に引数を与えない場合はnullとなります。

+0

わかりました。 – Julian

+0

しかし、それは引数nullで動作しません。それは例外を取得します:パラメータのカウントの不一致 – Julian

5

実行可能ファイルのエントリポイントはメソッドであり、メソッドにはインスタンスがありません。クラスは実行します。

あなたがMainクラスのインスタンスを作成しようとするのであれば、あなたは、メソッドの​​を取得する必要があります:

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

しかし、役に立たないこの場合は、静的メソッドを持っていないので、

:あなたがオブジェクト配列内の引数ごとに1つのエントリを作成することを確認し、パラメータを持つメソッドを呼び出したい場合は

method.Invoke(null, null); 

を:インスタンスそれはそうインスタンスを省略し、上と呼ばれているが、あなたがしなければならないすべてであります

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

私は メソッドを呼び出してください.Invoke(null、null); 例外をスローします:パラメータの数の不一致 私が電話すると オブジェクト[] args = {新しい文字列[] ""、 "}}}; メソッド.Invoke(null、args); 呼び出しの対象が例外を引き起こしました。 – Julian

+1

最後のエラーは、反対側で何かがうまくいかないことを意味します。そのプログラムをデバッグします。 –

関連する問題