2017-03-10 23 views
0

リソースからEXEファイルを実行することについて実験したいと思います。Assembly.Load - スローされた例外:mscorlib.dllの 'System.BadImageFormatException'

Assembly a = Assembly.Load(hm_1.Properties.Resources.HashMyFiles); 
MethodInfo method = a.EntryPoint; 
if (method != null) 
{ 
    method.Invoke(a.CreateInstance("a"), null); 
} 

**この実験では、私のリソースにあるHashMyFiles.exeという名前のファイルを使用しました。

はしかし、私は自分のコードをデバッグするとき、私はエラーを取得:

ex {"Could not load file or assembly '59088 bytes loaded from hm_1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."} System.Exception {System.BadImageFormatException}

私はx64プラットフォームモードとその逆にx86の実行に関する特定の記事を読んで、視覚的なスタジオでそれを変更し、まだ同じエラー。

アイデアはありますか? 注:ファイルをローカルから作成する必要はなく、リソースからのみ実行することができます。

+0

埋め込み型ではなく別のファイルでテストできますか? –

+0

Works完全にProcess.Start()を使用します。 しかし、私はリソースでそれをやりたいです。 – ItayNG

+0

あなたが良いでしょう[抽出](http://stackoverflow.com/questions/13031778/how-can-i-extract-a-file-from-an-embedded-resource-and-save-it-to-disk )リソースをいくつかの一時ファイルにロードしてからロードします。 –

答えて

0

あなたのコードは、管理対象アプリケーションでのみ機能します。

// You must change 'Properties.Resources.TestCs' to your resources path 
// You needed to use 'Invoke' method with 'null' arguments, because the entry point is always static and there is no need to instantiate the class. 
Assembly.Load(Properties.Resources.TestCs).EntryPoint.Invoke(null, null); 

しかし、あなたはリソースで管理されていないアプリを持っている場合、あなたはアセンブリとしてそれをロードcan`t:リソースから管理されたアプリケーションを実行するための正しい方法 。一時フォルダに「.exe」ファイルとして保存し、新しいプロセスとして実行する必要があります。このコードは、すべてのタイプのアプリケーション(管理対象および非管理対象)で正常に動作します。

// Generate path to temporary system directory. 
var tempPath = Path.Combine(Path.GetTempPath(), "testcpp.exe"); 

// Write temporary file using resource content. 
File.WriteAllBytes(tempPath, Properties.Resources.TestCpp); 

// Create new process info 
var info = new ProcessStartInfo(tempPath); 

// If you need to run app in current console context you should use 'false'. 
// If you need to run app in new window instance - use 'true' 
info.UseShellExecute = false; 

// Start new system process 
var proccess = Process.Start(info); 

// Block current thread and wait to end of running process if needed 
proccess.WaitForExit(); 
+0

ありがとうございました:)それは私が考えたものです。 – ItayNG

関連する問題