2010-05-17 11 views
8

अप्रबंधित दुनिया में, मैं एक __declspec (dllexport) लिखने में सक्षम था या वैकल्पिक रूप से, एक डीएलएल कॉल करने में सक्षम होने के लिए एक फ़ंक्शन का पर्दाफाश करने के लिए .DEF फ़ाइल का उपयोग करता था। (नाम __stdcall के लिए C++ में mangling की वजह से, मैं .def फ़ाइल तो कुछ अनुप्रयोगों सकता है कुछ निर्यात DLL कार्यों का फिर से उपयोग में उपनाम डाल दिया।) अब, मैं एक से एक ही प्रविष्टि सूत्री समारोह का पर्दाफाश करने में सक्षम होने में दिलचस्पी है .NET असेंबली, अप्रबंधित फैशन में, लेकिन इसे डीएलएल के भीतर .NET-style कार्यों में दर्ज किया है। क्या यह संभव है, एक सरल और सीधा-आगे फैशन में?मैं C++/CLI (.NET) मानक, अप्रबंधित non-.NET अनुप्रयोगों से DLLs कैसे कहते हैं?

मेरे पास एक तृतीय-पक्ष प्रोग्राम है जिसे मैंने डीएलएल (प्लगइन्स) के माध्यम से बढ़ाया है जो कुछ जटिल गणित को लागू करता है। हालांकि, तीसरे पक्ष के कार्यक्रम के पास गणनाओं को देखने के लिए मेरे लिए कोई साधन नहीं है। मैं किसी भी तरह, इन पूर्व लिखित गणित कार्यों ले उन्हें एक अलग DLL में संकलन (लेकिन .NET में C++/CLI का उपयोग), लेकिन फिर कार्यों के लिए हुक जोड़ने तो मैं प्रदान कर सकते हैं जो एक .NET में हुड के नीचे हो रहा है करना चाहते हैं उपयोगकर्ता नियंत्रण। मुझे यकीन नहीं है कि अप्रबंधित सामान के साथ .NET सामान को कैसे मिश्रित किया जाए, या इस कार्य को पूरा करने के लिए Google को क्या करना है।

कामयाब/अप्रबंधित पुल, या वैकल्पिक तरीकों के संबंध में विशिष्ट सुझाव ढंग मैं मददगार होगा वर्णन किया है में प्रतिपादन पूरा करने के लिए। धन्यवाद।

उत्तर

3

यह कोडप्रोजेक्ट आलेख प्रक्रिया को अच्छी तरह से बताता है।

एक अप्रबंधित आवेदन
http://www.codeproject.com/KB/mcpp/ijw_unmanaged.aspx

भी देखें here और here में कोड कामयाब इस्तेमाल करते हैं।

4

क्या आप सी ++/सीएलआई का उपयोग करते हैं क्योंकि आप चाहते हैं, या क्योंकि आपको लगता है कि आपको कार्यों को निर्यात करना है?

बाद के मामले में, मेरा unmanaged exports देखें, जो आपको डी # आयात करने के तरीके के बराबर सी # समकक्ष निर्यात में घोषित करने की अनुमति देता है।

internal class Sample 
{ 
    [DllExport("_export_test", CallingConvention.Cdecl)] 
    static int Test(int a) 
    { 
    return a + 1; 
    } 
} 
+0

मैं C++/CLI उपयोग करने के लिए है क्योंकि तृतीय-पक्ष लाइब्रेरी बस/clr विकल्प का उपयोग कर स्वचालित रूप से संकलित हैं चाहता था। फिर .NET ढांचे में टाई-इन्स जोड़ना जीवन को बेहतर बना देगा (मुझे लगता है।) आपका उदाहरण एक उचित दृष्टिकोण की तरह लगता है। धन्यवाद। – user343400

+0

मुझे यकीन नहीं है कि मैं यहां आपका अनुसरण कर रहा हूं। जब आप मेरा प्रोजेक्ट टेम्पलेट लेते हैं, तो यह स्वचालित रूप से संकलित होगा (यह एक .lib फ़ाइल भी बनाएगा)। अगर मैं आपको गलत समझता हूं, और आप वास्तव में सी ++/सीएलआई का उपयोग करना चाहते हैं। –

4

खैर, C++/CLI संकलक यह बहुत आसान बना देता है। बस एक स्थिर प्रबंधित फ़ंक्शन लिखें और इसे __declspec (dllexport) के साथ विशेषता दें। कंपाइलर एक स्टब इंजेक्ट करता है जो स्वचालित रूप से प्रबंधित कोड निष्पादित करने के लिए सीएलआर लोड करता है।

यह एक सेवा योग्य दृष्टिकोण है, यह बहुत एक्स्टेंसिबल नहीं है और यह बहुत तेज़ नहीं होगा। अगला कदम यह है कि आप [कॉमविज़िबल (सत्य)] विशेषता के साथ एक रेफ क्लास लिखते हैं। Regasm.exe के साथ इसे पंजीकृत करने के बाद, किसी भी अप्रबंधित COM जागरूक ग्राहक उस सर्वर का उपयोग कर सकते हैं। सीएलआर को स्वयं होस्ट करना (CorBindToRuntimeEx) आमतौर पर आखिरी पसंद है, लेकिन सबसे सार्वभौमिक है।


उदाहरण कोड:

ref class ManagedClass { 
public: 
    static void StaticFunc() {} 
}; 

extern "C" __declspec(dllexport) 
void __stdcall UnmanagedFunc() { 
    ManagedClass::StaticFunc(); 
} 
+0

यदि मुझे नाम पर __stdcall की आवश्यकता है और नाम के नाम पर @number से छुटकारा पाना चाहते हैं और एक .DEF फ़ाइल में उपनाम बनाने की आवश्यकता है, तो मैं इस मामले में ऐसा कैसे करूं? मुझे जो चाहिए वह एक बाहरी "सी" शैली हस्ताक्षर है, इसलिए इसे किसी विशिष्ट प्रकार के तृतीय पक्ष एप्लिकेशन द्वारा बुलाया जा सकता है। – user343400

+0

बस निर्यात पर बाहरी "सी" और __stdcall घोषणाकर्ताओं का उपयोग करें। आपको एक .def फ़ाइल की आवश्यकता नहीं है। नमूना पोस्ट किया गया। –

+0

@ हंसपैसेंट "कंपाइलर इंटजेक्ट्स स्टब" से आपका क्या मतलब है? क्या संकलक एक .lib उत्पन्न करता है (और UnmanagedFunc() के कॉलर को lib के साथ लिंक करने की आवश्यकता होगी)? जादू कोड के बहुत सारे – qqqqq

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