2013-12-10 7 views
6

मोनो द्वारा उत्पन्न सामान्य एक्सई आईएल में हैं। मैं मूल निष्पादन योग्य उत्पन्न करना चाहता हूं, एमकेबंडल मूल एक्सई का उपयोग करके करता हूं या क्या मुझे मोनो एओटी का उपयोग करना चाहिए।क्या मोनो एमकेबंडल मूल कोड

उत्तर

14

हां, mkbundle देशी निष्पादन योग्य बनाता है। उदाहरण के लिए, लिनक्स पर, यहाँ मेरी नेट विधानसभा है:

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

मैं mkbundle बता एक देशी निष्पादन करने के लिए इसे संकलित करने के लिए (यहाँ मैं Common.dll जो मेरे Agent.exe विधानसभा के लिए एक निर्भरता है जोड़ने के लिए):

 
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 

अब, चलो file आदेश को फिर से चलाते हैं, के खिलाफ उत्पन्न 'एजेंट' द्विआधारी इस समय:

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 

नोट: इस देशी बाइनरी अभी भी libmono (मोनो रनटाइम लाइब्रेरी) पर निर्भर करता है, इसलिए यह काम करने वाले मोनो इंस्टॉलेशन के बिना मशीन पर काम नहीं करेगा।

हालांकि आप अपनी बाइनरी में libmono एम्बेड कर सकते हैं और mkbundle --static विकल्प का उपयोग करके एक स्वतंत्र, स्वयं निहित निष्पादन योग्य प्राप्त कर सकते हैं।

+0

विस्तृत उत्तर के लिए धन्यवाद। इसलिए यदि मैं विंडोज़ में एमकेबंडल का उपयोग करता हूं तो यह आईएलसीडीईई के बजाय देशी कोड के साथ एक एक्सई फाइल का उत्पादन करेगा सही? .NET के मामले में मैंने सुरक्षा के लिए obfuscation का उपयोग किया है, क्या मैं इसे भी इस्तेमाल करूँ? – techno

+0

हां, यह mkbundle का उपयोग करने का बिंदु है। लेकिन मैं विंडोज़ पर इसे चलाने के तरीके के बारे में आपकी मदद नहीं कर सकता (मैं इसका उपयोग नहीं करता), मुझे केवल इतना पता है कि आपको mkbundle का उपयोग करने से पहले मिंगव कंपाइलर और सिगविन स्थापित करना होगा। – mbarthelemy

+0

क्या यह विकल्प यूआई में विजुअल स्टूडियो के लिए मैक में उपलब्ध है? – rraallvv

3

mkbundle एक निष्पादन योग्य प्रोग्राम है जो कमांड लाइन पर सूचीबद्ध विधानसभाओं की स्थिर प्रतियाँ शामिल होंगे उत्पन्न करता है।

मुझे संदेह है कि आप "मूल exe" शब्द से क्या उम्मीद करते हैं। यहाँ एक छोटा सा प्रयोग है:

Test01.cs

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

उत्पादन MSIL ldstr के तीन जोड़े और call निर्देश, और समाप्त ret अनुदेश शामिल करना चाहिए। उनके opcodes 0x72, 0x28 और 0x2a क्रमश: इस प्रकार हैं:

के हेक्स डंप जाँच करें (grep -P हमें उपयोग करने के लिए अनुमति देता है गैर लालची मैच *?)

$ 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 

अब हम उपरोक्त Test01.cs से संबंधित एमएसआईएल बाइट अनुक्रम को जानें।

$ 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 

दुर्भाग्य से मुझे नहीं लगता कि mkbundle(1)--full-aot की तरह किसी भी विकल्प हैं करते हैं: और mkbundle से उत्पादन बिल्कुल वैसा ही बाइट क्रम में शामिल है। तो एओटी और एक (स्थिर) बंडल एक्सई बनाना अब के रूप में पारस्परिक रूप से अनन्य है (मोनो 4.2.2.30)

+0

मूल रूप से मेरा मतलब प्लेटफार्म विशिष्ट कोड है .. आईएल कोड नहीं। मेरा मतलब क्या है .. क्या मुझे सी कंपाइलर द्वारा उत्पन्न एक की तरह बाइनरी मिल जाएगी? – techno

+0

फिर से, मुझे नहीं लगता कि आप एक ही समय में 'mkbundle' और AOT उपयोग कर सकते हैं, लेकिन आप [email protected] पर एक बेहतर समाधान हो सकता है – nodakai

+0

वह सही है, सब यह होता है सीधे प्रतिलिपि है। डीएलएल और .exe फ़ाइलों को एक असेंबली में, यह उन्हें मशीन कोड में संकलित नहीं करता है – evolvedmicrobe

संबंधित मुद्दे