2013-12-10 19 views
6

EXE bình thường được tạo bởi mono là IL.I muốn tạo Native Executable, không sử dụng mkbundle sản xuất ra bản địa của Exe hoặc tôi nên sử dụng Mono AOT.Mono Mkbundle Sản xuất Mã gốc

Trả lời

14

Có, mkbundle sản xuất các tệp thực thi gốc. Ví dụ, trên Linux, đây là lắp ráp NET của tôi:

file Agent.exe 
Agent.exe: PE32 executable (console) Intel 80386, Mono/.Net assembly, for MS Windows 

tôi nói với mkbundle để biên dịch nó vào một thực thi bản địa (ở đây tôi có thêm Common.dll mà là một sự phụ thuộc để lắp ráp Agent.exe của tôi):

 
mkbundle --deps -o Agent Agent.exe Common.dll 
    OS is: Linux 
    Sources: 3 Auto-dependencies: True 
    embedding: Agent/bin/Debug/Agent.exe 
    embedding: Agent/bin/Debug/Common.dll 
    embedding: /usr/lib/mono/4.5/mscorlib.dll 
    embedding: /usr/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll 
    embedding: /usr/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll 
    embedding: /usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll 
    embedding: /usr/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll 
    embedding: /usr/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll 
    embedding: /usr/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll 
    embedding: /usr/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll 
    embedding: /usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll 
    embedding: /usr/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll 
    embedding: /usr/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll 
    embedding: /usr/lib/mono/gac/Mono.Data.Tds/4.0.0.0__0738eb9f132ed756/Mono.Data.Tds.dll 
    embedding: /usr/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll 
    embedding: /usr/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll 
Compiling: 
as -o temp.o temp.s 
cc -ggdb -o Agent -Wall temp.c `pkg-config --cflags --libs mono-2` temp.o 
Done 

Bây giờ, Hãy chạy lệnh file một lần nữa, lần này so với đồng tạo 'chất độc' nhị phân:

file Agent 
Agent: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=698384c13208eccc609e5a573deeb09ed3420a29, not stripped 

Lưu ý: mẹ đẻ này nhị phân vẫn còn phụ thuộc vào libmono (thư viện thời gian chạy Mono), vì vậy nó sẽ không hoạt động trên một máy mà không cần cài đặt Mono đang hoạt động.

Tuy nhiên, bạn có thể nhúng libmono vào tệp nhị phân của mình và nhận được tệp thực thi độc lập, độc lập bằng cách sử dụng tùy chọn mkbundle --static.

+0

Cảm ơn câu trả lời chi tiết. Nếu tôi sử dụng mkbundle trong cửa sổ, nó sẽ tạo một tệp exe với mã gốc chứ không phải ILCODE đúng? Trong trường hợp. Net tôi đã sử dụng obfuscation để bảo vệ tôi nên sử dụng nó quá? – techno

+0

Vâng, đó là điểm của việc sử dụng mkbundle. Nhưng tôi không thể giúp bạn về cách chạy nó trên Windows (tôi không sử dụng nó), tôi chỉ biết rằng bạn sẽ phải cài đặt trình biên dịch Mingw và Cygwin trước khi sử dụng mkbundle. – mbarthelemy

+0

Tùy chọn này có sẵn trong giao diện người dùng trên Visual Studio dành cho Mac không? – rraallvv

3

mkbundle tạo ra một chương trình thực thi sẽ chứa bản tĩnh của các hội đồng được liệt kê trên dòng lệnh.

Tôi nghi ngờ đây là những gì bạn mong đợi từ một từ "nguồn gốc bản địa". Dưới đây là một thí nghiệm nhỏ:

Test01.cs

using System; 
public class Test01 { 
    public static void Main() 
    { 
    Console.WriteLine("Hello, world!"); 
    Console.WriteLine("Hello, world!"); 
    Console.WriteLine("Hello, world!"); 
    } 
} 

Sản lượng MSIL nên chứa ba cặp ldstrcall hướng dẫn, và chấm dứt ret hướng dẫn. opcodes của họ là 0x72, 0x28 và 0x2a, tương ứng:

Hãy kiểm tra các bãi hex (grep -P cho phép chúng ta sử dụng không tham lam trận đấu *?)

$ od -t x1 -w9999999 Test01.exe | grep -o -P 72.*?28.*?2a 
... 
72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a 

Bây giờ chúng ta biết chuỗi byte MSIL tương ứng với số Test01.cs ở trên. Và đầu ra từ mkbundle chứa chính xác chuỗi byte cùng:

$ mkbundle -o Test01 Test01.exe --deps 
... 
$ od -t x1 -w9999999 Test01 | fgrep -o '72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a' 
72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a 

Đáng tiếc là tôi không nghĩ mkbundle(1) có bất kỳ tùy chọn như --full-aot. Vì vậy, AOT và tạo ra một gói exe (tĩnh) là loại trừ lẫn nhau như hiện nay (Mono 4.2.2.30)

+0

Bởi bản địa tôi có nghĩa là nền tảng mã cụ thể .. không IL Code.What tôi có nghĩa là .. tôi sẽ nhận được một nhị phân như một tạo ra bởi một trình biên dịch c? – techno

+0

Một lần nữa, tôi không nghĩ rằng bạn có thể sử dụng 'mkbundle' và AOT cùng một lúc, nhưng bạn có thể có một giải pháp tốt hơn tại [email protected] – nodakai

+0

Anh ấy đúng, tất cả những gì nó làm là sao chép trực tiếp. dll và .exe tập tin vào một hội đồng, nó không biên dịch chúng vào mã máy – evolvedmicrobe

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