2012-05-17 34 views
5

Tôi đang tạo một chương trình để xem liệu tôi có thể chạy một mảng byte trong C# hay không.Thực hiện mảng Byte như một chương trình mới

Chương trình sẽ lấy một mảng byte "MyBinaryData" và Tải + Chạy nó dưới dạng chương trình mới. Sẽ có một hộp văn bản nơi bạn có thể nhập các byte để xem kết quả (đó là một thử nghiệm;)). Tôi đã thử này:

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.... 
      } 

Vấn đề là nó mang lại cho lỗi này: "System.Reflection.TargetInvocationException: ...... SetCompatibleTextRenderingDefault phải được gọi trước khi đối tượng IWin32Window đầu tiên được tạo ra trong ứng dụng . "

thử nghiệm thứ hai của tôi là:

Assembly assembly = Assembly.Load(binaryData); 

Type bytesExe = assembly.GetType(); // problem: the GetType(); needs to know what class to run. 
Object inst = Activator.CreateInstance(bytesExe); 

Nhưng điều này cần phải biết những gì lớp trong mảng byte nó cần phải chạy.

sau đó tôi đã cố gắng:

var bytes = Assembly.Load(binaryData); 
var entryPoint = bytes.EntryPoint; 
var commandArgs = new string[0]; 
var returnValue = entryPoint.Invoke(null, new object[] { commandArgs }); 

Nhưng nó đã cho tôi điều này: "System.Reflection.TargetInvocationException: ngoại lệ đã được ném bởi mục tiêu của một invocation ---> System.InvalidOperationException:. SetCompatibleTextRenderingDefault phải được gọi trước khi đối tượng IWin32Window đầu tiên được tạo trong ứng dụng. "

program.cs của tôi là:

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()); 
    } 
} 

}

Tôi có thể làm gì cách khác này đã toàn bộ chương trình mở?

Xin cảm ơn trước.

+0

Rõ ràng bạn không chỉ cần gõ byte ngẫu nhiên, byte [] bạn đang sử dụng là một assembly, một Winforms. Mà không * không * như nó khi bạn gọi EnableVisualStyles() sau khi chương trình đã bắt đầu. Vâng, khi các byte làm. –

+0

Có, nó không phải là ngẫu nhiên, nhưng mã hết hạn. Cảm ơn vì tiền hỗ trợ! – SteveLacy

Trả lời

3

Bạn có hai cách

cách trước tiên hãy .exe từ đó mảng byte và sau đó bắt đầu nó

cái nhìn thứ hai tại đây execute byte array

+0

Tôi đã xem xét cả hai và tùy chọn thứ hai trông gần với những gì tôi muốn. Bạn có thể giải thích một cách để sử dụng nó trong dự án của tôi? Cảm ơn – SteveLacy

+0

@AZInventor là mảng byte C# chương trình của bạn hay không? – Likurg

+1

Đọc http://www.codeproject.com/Articles/18677/Dynamic-Assemblies-using-Reflection-Emit-Part-II-o – Likurg

Các vấn đề liên quan