C#でバイト配列を実行できるかどうかを確認するプログラムを作成しています。
プログラムはバイト配列「MyBinaryData」を取得し、それを新しいプログラムとしてロード+実行する必要があります。結果を確認するためにバイトを入力できるテキストボックスがあります(これは実験です;))。私はこれを試しました:
byte[] binaryData = System.IO.File.ReadAllBytes("MyBytes.txt"); // the bytes are in a .txt file for simple tests before becoming a textbox.
Assembly LoadByte = Assembly.Load(binaryData);
MethodInfo M = LoadByte.EntryPoint;
if (M != null)
{ object o = LoadByte.CreateInstance(M.Name);
M.Invoke(o, new Object[] { null }); // this gives the error
}
else {
..... fail code here....
}
問題は、次のエラーが発生することです。「System.Reflection.TargetInvocationException:...... SetCompatibleTextRenderingDefaultは、アプリケーションで最初のIWin32Windowオブジェクトを作成する前に呼び出す必要があります。」
私の2番目のテストは次のとおりです。
Assembly assembly = Assembly.Load(binaryData);
Type bytesExe = assembly.GetType(); // problem: the GetType(); needs to know what class to run.
Object inst = Activator.CreateInstance(bytesExe);
ただし、これは、バイト配列内のどのクラスを実行する必要があるかを知る必要があります。
次に試しました:
var bytes = Assembly.Load(binaryData);
var entryPoint = bytes.EntryPoint;
var commandArgs = new string[0];
var returnValue = entryPoint.Invoke(null, new object[] { commandArgs });
しかし、これは次のようになりました。「System.Reflection.TargetInvocationException:呼び出しのターゲットによって例外がスローされました。---> System.InvalidOperationException:SetCompatibleTextRenderingDefaultは、アプリケーションで最初のIWin32Windowオブジェクトが作成される前に呼び出す必要があります。」
私のprogram.csは次のとおりです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Crypter
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form2());
}
}
}
プログラム全体を開くには、他にどのような方法がありますか?
前もって感謝します。