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
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
.
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 ldstr
và call
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)
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
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
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
- 1. "Mã sản xuất" là gì?
- 2. System.Diagnostics.Debug.WriteLine trong mã sản xuất
- 3. Nhận sản xuất APNS mã thông báo
- 4. Hợp đồng Mã trong Mono
- 5. Học Mono Mã nguồn
- 6. Phát hiện rò rỉ bộ nhớ trong mã sản xuất
- 7. Có ai đang chạy một trang ASP.NET sản xuất trên đầu trang của Mono không?
- 8. NHibernate SchemaUpdate có an toàn trong mã sản xuất không?
- 9. Tải lại mã trên máy chủ vành đai sản xuất
- 10. Quy trình làm việc trong mã sản xuất
- 11. gas vs nasm: mà assembler sản xuất mã tốt nhất?
- 12. CouchDB trong sản xuất
- 13. Picasso sản xuất OutOfMemoryError
- 14. Tôi nên sử dụng thư viện gốc tomcat nào trong sản xuất?
- 15. Python reindex Sản xuất Nan
- 16. HtmlUnit + Selenium trong Sản xuất
- 17. Xuất bản gốc thành phần
- 18. Làm cách nào để tạo kết xuất chuỗi bằng MONO?
- 19. Làm thế nào để chuyển đổi một dự án giao diện điều khiển .Net đơn giản thành một exe di động với Mono và mkbundle?
- 20. Python SimpleHTTPServer trong sản xuất
- 21. LAMP, XAMPP cho sản xuất
- 22. Docker soạn trong sản xuất?
- 23. Đọc mã gốc JavaScript
- 24. Phân phối ứng dụng mà không cần cài đặt mono
- 25. Dplyr sản xuất NaN trong khi cơ sở sản xuất R NA
- 26. "Cách thích hợp để kéo git" nhánh sản xuất "vào máy chủ sản xuất
- 27. Gặp lỗi khi sản xuất NA
- 28. C++ xuất phát từ kiểu gốc
- 29. Lỗi được sản xuất từ mysql chọn
- 30. Sử dụng tính năng biên dịch mono aot/aot-full: không có gì xuất hiện?
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
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
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