100%

2017-07-20 4 views
0

の作業ではないC#のリフレクションは、私はリソースとして管理実行可能でプログラムを持って、 私は次のコードでリフレクションを使用してexeファイルをロードしよう:100%

byte[] file = Properties.Resources.ExeName; 
Assembly assembly = Assembly.Load(file); 
// search for the Entry Point 
MethodInfo method = assembly.EntryPoint; 
if (method != null) 
{ 
    // create an instance of the Startup form Main method 
    object handle = assembly.CreateInstance(method.Name); 
    // invoke the application starting point 
    method.Invoke(handle, null); 
} 

私がロードしようとアセンブリがあります次の命令持つの.NET Framework 2.0に対してコンパイル有効マネージドアセンブリ:

MessageBox.Show("Some Text"); 
//other stuff goes here 

は、問題は、私は私がどんなMessageBox.Show ("Message")ダイアログを取得しないアプリケーションを実行すると、私は、コードのすべてがするまで正常に動作してブレークポイントを入れてみましたですそれはr私はここにステップオーバーしたら、それは任意のエラーまたは例外ではない、それはエディタ(VS 2017のCommunity Edition)がフリーズを与えないどちらも、何も起こりません、

method.Invoke(handle, null); 

:命令をeaches。

私はそれが正常に動作し、他のマネージアセンブリをロードしようとした(アセンブリが同じ.NET Frameworkのバージョン(2.0)に対して遵守されて提供されます)。

誰もが予想されるように、所望のexeファイルを実行しない理由かもしれない可能なものを指すことができます。

+2

だけではサイズがそれを行うには何も持ってはいけません。私たちは仕事でマルチメガバイトのアセンブリを持っており、反射はうまく動作します。いずれにしても、「なぜ私のコードが機能していないのですか」といったコンテンツを含む投稿は、いくつかのコードを投稿する必要があります。また、300KBのファイルが実際に.NETアセンブリであることを確認していますか?あなたのプログラムで空のキャッチブロックを使ってtry/catch文がありますか? –

+1

実行ファイルのサイズは何とは何の関係もありません。反射*を使ってexeをロードすることが何を意味するのかは不明です。 **あなたは何をしようとしていますか?あなたはすべてのあなたが*ロード*(つまり、あらゆる手段).NET実行可能ファイルを管理されている実行ファイルの特定はありますか?ネイティブアプリケーションではリフレクションは機能しません。 LasseV.Karlsen @ –

+0

、イエスのファイルがあります。あなたのコメント – Constantine

答えて

0

Assembly.EntryPointは、WindowsフォームプロジェクトであってもMainメソッドであるアセンブリのエントリポイントであるメソッドです。これは、メソッドを返しているので、これはMain方法の場合には、おそらくNamespace.For.Project.Programと呼ばれるタイプ(のインスタンスを作成するために使用されているように、あなたはそれにAssembly.CreateInstanceを呼び出すことはできません。

をあなたはまた、確認する必要があります

static void Main(string[] args) 

この:簡単なコンソールアプリケーションでは、Main方法は、以下の署名を持っているあなたはmethod.Invokeへの呼び出しの2番目のパラメータでは、あなたが呼んでいるメソッドへのパラメータの正しい数を渡していること。 1つのパラメータをarraに渡す必要があることを意味します文字列のy。すべて一緒にこれを置くあなたが得る:

私は「シンプル」コンソールアプリケーションとして Properties.Resources.Exenameによって参照されるアセンブリを作成しました
byte[] file = Properties.Resources.ExeName; 

Assembly assembly = Assembly.Load(file); 
// search for the Entry Point 
MethodInfo method = assembly.EntryPoint; 

if (method != null) 
{ 
    // Get the type that implements the EntryPoint method 
    var implementingType = method.DeclaringType; 
    // Call the EntryPoint method, passing in an empty array of strings as its parameters 
    method.Invoke(implementingType, new object[] { new string[] { } }); 
} 

Main方法については、以下で(.NET Framework 2.0を対象):

static void Main(string[] args) 
{ 
    MessageBox.Show("Message " + args == null ? "NULL" : "NOT NULL " + args.Length); 
} 

プログラムを実行すると、 "NOT NULL 0"というテキストが表示されたメッセージボックスがポップされ、パラメータが通過して空の配列になっていることがわかります。