2012-01-22 11 views
8

मैंने ईसीएमए 335 की समीक्षा की है और मुझे केवल .export कीवर्ड का संदर्भ मिला है जो कि आशाजनक प्रतीत होता है लेकिन बहुत कम दस्तावेज है। मुझे सी # में ऐसा करने के संबंध में स्टैक ओवरव्लो पर समान प्रश्न मिल गए हैं। हालांकि, इनमें से कोई भी अब तक कहीं भी उपयोगी नहीं है।आप एक सीआईएल डीएलएल में एक विधि कैसे निर्यात करते हैं ताकि एक मूल कार्यक्रम इसे कॉल कर सके?

नीचे की रेखा है: मेरे पास एक सीआईएल डीएलएल है और मैं अपने कुछ स्थिर तरीकों को देशी सी ++ एप्लिकेशन से आमंत्रित करना चाहता हूं।

उत्तर

14

ILAsm के नए संस्करण में, आप बस कर सकते हैं:

.method public static void Foo() 
{ 
    .export [1] 

    // code ... 
} 

यह निर्यात तालिका में इंडेक्स को 1 पर फू निर्यात करता है। निर्यात ordinals अद्वितीय और अनुक्रमिक होना चाहिए।

पुराने संस्करणों में, आप क्या करना होगा:

.data vt = int32 (0) [n] 
.vtfixup [n] int32 fromunmanaged at vt 

.method public static void Foo() 
{ 
    .vtentry 1:1 
    .export [1] 

    // code ... 
} 

.vtentry इंगित करता है जो vtable (कहाँ 'एन' निर्यात आप चाहते हैं की राशि है।): स्लॉट स्टोर करने के लिए विधि में। (तालिका आईडी अनुक्रमिक हैं, और इसलिए घोषणा आदेश पर निर्भर करते हैं।)

नए आईएलएएमएस आपके लिए यह सब काम करते हैं, बशर्ते कि आप किसी और चीज़ के लिए निर्यात तालिका का उपयोग न करें।

ध्यान दें कि यह सब बहुत ही अयोग्य है।

1

आपको कॉम डीएल के रूप में अपना डीएल एक्सपोज़ करना होगा। कॉम नेटनेट को नेट इंटरऑप करने का काम करता है। आप आईएन कोड को .NET VM के अलावा कुछ भी नहीं चला सकते हैं।

+0

जैसा कि ज़ोर का समाधान दिखाता है, यह COM पागलपन के बिना संभव है। –

+0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन ilasm अभी भी एक पीई MSIL फ़ाइल उत्पन्न करता है, फिर भी मूल एप्लिकेशन से कॉल करने के लिए उपयुक्त नहीं है। कोड को निष्पादित करने के लिए आपको अभी भी एक .NET VM की आवश्यकता है। – antiduh

+1

प्रबंधित कोड COM के माध्यम से बुलाए जाने पर भी वीएम के बिना जादुई रूप से दौड़ नहीं सकता है। मेरा समाधान केवल प्रबंधित विधियों को निर्यात करता है, जैसे कि जब उन्हें मूल कोड से कहा जाता है, तो .NET VM प्रबंधित कोड को चलाता है और निष्पादित करता है, और उसके बाद मूल कोड पर वापस आता है। –

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