2012-03-06 15 views
11

मेरा लक्ष्य एक निष्पादन योग्य बनाना है जो एक छाया प्रतिलिपि अनुप्रयोग शुरू करेगा। यह चाल है, मैं चाहता हूं कि इस स्टार्टर प्रोग्राम में कोई बाहरी निर्भरता न हो और उसे शुरू होने वाले कार्यक्रम के बारे में कोई जानकारी न हो।क्या सी #। डीएल असेंबली में प्रवेश बिंदु हो सकता है?

मैं यह भी निर्देशिका में एकमात्र निष्पादन योग्य होना चाहता हूं। दूसरे शब्दों में, मैं चाहता हूं कि यह एक .dll असेंबली ".ex" असेंबली न हो। (मुझे आवश्यकता हो सकती है कि .dll फ़ाइल का नाम किसी नए ऐपडोमेन में लोड किया जा रहा है, जैसे कि Main.dll या उस तरह कुछ।)

ऐसा लगता है कि AppDomain.ExecuteAssembly ठीक वही करेगा जो मैं चाहता था। यह कहता है कि यह ".NET Framework शीर्षलेख में निर्दिष्ट प्रविष्टि बिंदु" पर निष्पादन प्रारंभ करेगा।

जब मैं उस फ़ंक्शन का उपयोग करने का प्रयास करता हूं तो मुझे त्रुटि मिलती है "एंट्री पॉइंट असेंबली 'DllApp' में नहीं मिलता है।

स्टार्टर कार्यक्रम मेरे पास है, बस विधानसभा चलाने का प्रयास:,

static void Main() 
{ 
    AppDomain domain = AppDomain.CreateDomain("DllApp"); 
    domain.ExecuteAssembly("DllApp.dll"); 
} 

आवेदन कोड, एक .dll फ़ाइल में एक डिफ़ॉल्ट प्रवेश बिंदु के साथ:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

This page on Main() functions का कहना है कि "पुस्तकालयों और सेवाओं को प्रवेश विधि के रूप में मुख्य विधि की आवश्यकता नहीं है"। यह नहीं कहता कि वे में डिफ़ॉल्ट प्रविष्टि बिंदु भी नहीं हो सकता है।

मैं सार्वजनिक/निजी static void मुख्य, किसी पूर्णांक वापसी प्रकार के सभी विभिन्न क्रमपरिवर्तन की कोशिश की है, स्ट्रिंग [] तर्कों के रूप आर्ग, एक नाम स्थान, कोई नाम स्थान, स्थिर/गैर स्थैतिक कक्षा, आदि

साथ

मैं मार्शलबीरफॉबजेक्ट से प्राप्त होने के लिए अपना कोड बदल सकता था और उसके बाद ऑब्जेक्ट बनाने के लिए CreateInstance का उपयोग कर सकता था, लेकिन ऐसा लगता है कि यह स्टार्टर को उस कार्यक्रम के लिए अधिक कसकर जोड़ देगा जो इसे शुरू करना है। अगर मैं ExecuteAssembly का उपयोग कर सकता हूं, तो एप्लिकेशन को शुरू करने के लिए केवल स्थिर शून्य मुख्य की आवश्यकता होगी, और यह वास्तव में सरल और गड़बड़ करना मुश्किल है।

क्या एक .dll असेंबली के लिए डिफ़ॉल्ट प्रविष्टि बिंदु होना संभव है, और ExecuteAssembly के लिए इसे ढूंढने के लिए, या क्या मुझे बस एक और मार्ग जाने के लिए इस्तीफा देना है?

+1

यह .NET असेंबली (डीएल) के लिए एक प्रविष्टि बिंदु होने का अर्थ नहीं है क्योंकि स्वयं ही प्रक्रिया के रूप में लॉन्च नहीं किया गया है। – Zenwalker

उत्तर

17

आप एक .NET ऐप को एक exe (जो एक असेंबली है) के रूप में संकलित कर सकते हैं और इसे डीएलएल में बदल सकते हैं और यह सामान्य .NET .dll असेंबली के रूप में कार्य करेगा। इसके बाद आपका प्रवेश बिंदु होगा।

+0

यह किसी और चीज को बदलने के बिना पूरी तरह से काम किया। आश्चर्य है कि मैंने इसके बारे में क्यों नहीं सोचा था ... धन्यवाद कीथ। – Sean

-1

संक्षिप्त उत्तर नहीं है। एक डीएलएल फ़ाइल एक गतिशील रूप से जुड़ी लाइब्रेरी है जो कोड को दूसरी लाइब्रेरी द्वारा बुलाया जाता है। मुझे लगता है कि कीथ ने तकनीकी रूप से काम किया था .. आप शायद इसे तब तक नामित कर सकते हैं जब तक आप भी .txt या .pdf को तब तक सही तरीके से आवेदन शुरू करते हैं। मेरे पास मुख्य प्रश्न यह है; तुम क्या करने की कोशिश कर रहे हो?? जब तक आप मैलवेयर लिखने की कोशिश नहीं कर रहे हैं, तो आप ऐसा क्यों करना चाहते हैं? यह नहीं कि मैं खराब उद्देश्यों के लिए मैलवेयर के लेखन को स्वीकार करता हूं लेकिन मुझे पता है कि लोग अपनी प्रयोगशाला में प्रयोग करना पसंद करते हैं, इसलिए मैं इसे निंदा नहीं करता हूं। यदि आप मैलवेयर लिख रहे हैं जैसे सी ++, सी या असेंबलर बेहतर शर्त हो सकता है तो मुझे लगता है कि सी # काम पूरा कर सकता है लेकिन मुझे लगता है कि ...

+0

बिंदु मेरे उत्तर के साथ है कि संकलक या तो डीएलएस या exes उत्पन्न करता है, लेकिन दोनों विधानसभाएं हैं, इसकी बस exes परिभाषित एक प्रविष्टि बिंदु के साथ असेंबली हैं, जो वह पूछ रहा था। –

+1

नहीं, यहां कोई मैलवेयर लेखन नहीं है। मैं अपने मुख्य आवेदन की प्रतिलिपि बनाने के लिए एक छोटा स्टार्टर प्रोग्राम बनाने की कोशिश कर रहा हूं। फिर मैं अपडेट के लिए अलग-अलग एक्जिक्यूटिव के अन्य हुप्स के माध्यम से कूदने के बिना अपने मुख्य एप्लिकेशन को आसानी से अपडेट कर सकता हूं। मैं चाहता था कि स्टार्टर पूरी तरह से पूरी तरह से डीकॉप्लेड हो जाए, तो मैं इसे अपने सभी एप्लिकेशन के साथ उपयोग कर सकता हूं। – Sean

+0

"जब तक आप मैलवेयर लिखने की कोशिश नहीं कर रहे हैं" एलओएल !! –

0

मुझे सलाह मिलती है कि इसका पालन करना इतना आसान नहीं है। कुछ प्रयोग करने के बाद मैं सफलतापूर्वक कैसे आया:

मैंने एक साधारण मुख्य के साथ एक कंसोल एप्लिकेशन बनाया और मेरे मूल DLL से शेष कोड शामिल किया।

namespace FIT.DLLTest 
{ 
    public class DLLTest 
    { 
    [STAThread] 
    static void Main(string[] args) 
    { 
     int a = 1; 
    } 

    public DLLTest() 
    { 
     int b = 17; 
    } 

    public int Add(int int1, int int2) 
    { 
     return int1 + int2; 
    } 
    } 
} 

संकलन के बाद मैं एक .DLL को .exe उत्पन्न नाम बदला: नीचे एक सरल कार्यक्रम है जो एक DLL शामिल है।

मां कार्यक्रम में, जो डीएलएल I का उपयोग करता है, मैंने पहले DLLTest.dll को संदर्भ के रूप में जोड़ा, फिर मैंने डीएलएल निष्पादित करने के लिए कोड जोड़ा।

namespace TestDLLTest 
{ 
    class TestDLLTest 
    { 
    static void Main(string[] args) 
    { 
     AppDomain domain = AppDomain.CreateDomain("DLLTest"); 
     domain.ExecuteAssembly("DllTest.dll"); 

     DLLTest dt = new DLLTest(); 
     int res2 = dt.Add(6, 8); 
     int a = 1; 
    } 
    } 
} 

वियोला मैं निष्पादित और DLLTest.Main विधि में एक ब्रेकपाइंट जोड़ सकते हैं और देखते हैं कि मैं DLLTest के मुख्य आह्वान सकता सकता है। चर्चा लोगों के लिए धन्यवाद!

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