2010-06-04 15 views
15

से प्रोग्राम चलाएं मेरे पास बाइट सरणी में एक प्रोग्राम संग्रहीत है।बाइट सरणी

क्या इसे सी # के अंदर चलाने के लिए संभव है?

+2

किस प्रकार का कार्यक्रम? –

+0

आइए कहें कि मेरे पास एक सरल प्रोग्राम है जो बाइट सरणी – DanSpd

+8

के अंदर संग्रहीत टेक्स्ट "हैलो" दिखाता है उस सरणी की सामग्री क्या है? स्रोत कोड, निष्पादन योग्य कोड? – Ikke

उत्तर

11

निश्चित रूप से।

  1. बाइट सरणी को .exe फ़ाइल में सहेजें।
  2. फ़ाइल निष्पादित करने के लिए Process कक्षा का उपयोग करें।

नोट: इस संभालने है कि आपके बाइट सरणी निष्पादन योग्य कोड, और नहीं स्रोत कोड है। यह भी मानता है कि आपके पास एक वैध पीई हेडर है या आप इसे कैसे बनाना चाहते हैं।

+2

+1 सरल और सीधा! – Kryptic

+0

उन्हें निष्पादन योग्य शीर्षलेख को सही करने की आवश्यकता हो सकती है? – m0s

+1

क्या ऐसा करना संभव है लेकिन वास्तव में exe फ़ाइल में बाइट सरणी को सहेजने के बिना? इसके अलावा हाँ यह निष्पादन योग्य है। – DanSpd

4

आप वर्चुअल मशीन बना सकते हैं और कोड निष्पादित कर सकते हैं या आप एक गतिशील असेंबली बनाने के लिए प्रतिबिंब और गतिशील प्रकारों का उपयोग कर सकते हैं। आप गतिशील रूप से असेंबली लोड कर सकते हैं।

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx

आप इस प्रकार संभवतः यह उस के साथ कुछ कर सकते हैं। अगर मेरी याददाश्त मेरी सेवा करती है हालांकि कुछ सीमाएं हैं।

देखें

प्रतिबिंब Assembly.Load आवेदन डोमेन

15

हां। This answer दिखाता है कि आप सीधे बाइट सरणी की सामग्री निष्पादित कर सकते हैं। असल में, आप ज्ञात पते (IntPtr) के साथ ढेर पर निष्पादन योग्य क्षेत्र आवंटित करने के लिए VirtualAlloc का उपयोग करते हैं। फिर आप अपने बाइट सरणी को Marshal.Copy के साथ उस पते पर कॉपी करें। आप पॉइंटर को GetDelegateForFunctionPointer के साथ एक प्रतिनिधि को परिवर्तित करते हैं, और अंत में इसे सामान्य प्रतिनिधि के रूप में कॉल करते हैं। यदि typeToExecute अपने बुला कार्यक्रम के लिए जाना जाता एक अंतरफलक को लागू करता है, तो आप इसे इस इंटरफेस के लिए डाली और आह्वान कर सकते हैं, अब

Assembly assembly = AppDomain.Load(yourByteArray) 
Type typeToExecute = assembly.GetType("ClassName"); 
Object instance = Activator.CreateInstance(typeToExecute); 

:

11

बाइट सरणी मान लिया जाये कि एक .net विधानसभा (.exe या .dll) शामिल हैं इस पर विधि: बाइट सरणी एक EntryPoint (मुख्य विधि) के साथ एक नेट विधानसभा है

((MyInterface)instance).methodToInvoke(); 
6

अगर तुम सिर्फ ऐसा कर सकता है। अधिकांश समय returnValuenull होगा। और यदि आप कमांड लाइन तर्क प्रदान करना चाहते हैं तो आप उन्हें नीचे सूचीबद्ध commandArgs स्ट्रिंग में डाल सकते हैं।

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