2013-06-15 6 views
9

मैं विजुअल स्टूडियो 2010 प्रो/सी # प्रोजेक्ट में रॉबर्ट गिसके द्वारा "अप्रबंधित निर्यात" एक्सटेंशन का उपयोग करने का प्रयास कर रहा हूं। फिर भी, मैं इसे काम नहीं कर सकता - जब मैं निर्यात के लिए संकलित डीएलएल की जांच करता हूं, दर्शक (http://www.nirsoft.net/utils/dll_export_viewer.html) हमेशा खाली हो जाता है, कोई निर्यात बिल्कुल परिभाषित नहीं होता है।सी # "अप्रबंधित निर्यात"

मेरे पास सब कुछ है लेकिन उदाहरण की प्रतिलिपि बनाई है और x86 पर बिल्ड/कॉन्फ़िगरेशन प्रबंधक/सक्रिय प्लेटफ़ॉर्म सेट करें। क्या मैं किसी भी तरह से जांच सकता हूं कि एमएसबिल्ड कार्य जो सभी जादू करता है वास्तव में चल रहा है या नहीं? प्रोजेक्ट फ़ाइल में क्या होना चाहिए (ऐसा लगता है कि यह मेरे लिए संदिग्ध रूप से खाली है?)

+1

आप निर्यात किए गए कार्यों को देखने के लिए http://www.dependencywalker.com/ का भी उपयोग कर सकते हैं। मैंने पहले उपरोक्त दृष्टिकोण का उपयोग किया है, लेकिन यह बताना मुश्किल है कि अधिक जानकारी के बिना क्या गलत हो रहा है। क्या गलत हो रहा है डीबग करने के लिए शायद पूरी परियोजना को देखने की आवश्यकता होगी। –

उत्तर

1

मैं संस्करण 1.1.3 का उपयोग कर रहा हूं और देख रहा हूं कि अब NuGet समर्थन के साथ एक नया संस्करण है। मैंने बस इसके साथ एक परीक्षण किया।

क्या मैं किसी भी तरह से जांच सकता हूं कि एमएसबिल्ड कार्य जो सभी जादू करता है वास्तव में चल रहा है या नहीं?

आप कमांड लाइन का उपयोग कर MSBuild से अधिक विस्तार प्राप्त कर सकते हैं या शब्दाडंबर कि दृश्य स्टूडियो अनुरोध को समायोजित: Tools > Options > Project and Solutions > Build and Run > MSBuild project build output verbosity [वी.एस. 2010]। जैसे ही आप समस्या निवारण कर रहे हैं, आप शायद इसे रीसेट करना चाहेंगे।

मैंने देखा कि लक्ष्य और कार्य कहा जा रहा था, लेकिन जब तक मैंने प्रोजेक्ट प्लेटफ़ॉर्म को x86 पर स्विच नहीं किया तब तक कोई परिणाम नहीं देखा। तब मैं Adding .vtentry:0 .export सहित विभिन्न, प्रासंगिक लॉग प्रविष्टियों को देखने ....

क्या परियोजना फ़ाइल भी होनी चाहिए (यह मेरे लिए संदेह से खाली हो रहा है?)

और भी बहुत कुछ में की जरूरत नहीं है परियोजना फाइल। NuGet यह सब करता है: DllExport असेंबली का संदर्भ और लक्ष्य फ़ाइल के लिए शामिल है।

एक जोड़े चीजें हैं जो मुझे लगता है कि के बारे में सोच सकते हैं आप को ट्रिपिंग हो सकता है:

  1. सुनिश्चित करें कि आप वास्तव में इस परियोजना के निर्माण कर रहे हैं। समाधान बिल्ड प्रबंधक में कुछ प्रोजेक्ट्स चयनित समाधान कॉन्फ़िगरेशन के लिए सेट करने के लिए सेट नहीं हो सकती हैं।
  2. सुनिश्चित करें कि आप सही DLL की जांच कर रहे हैं। निर्माण कार्य बिल्ड लॉग में पथ लिखता है। रेखा Assembling के साथ शुरू होती है।
+0

घंटों के लिए संघर्ष कर रहा था ... और आपका उल्लेख ** बिंदु # 2 ** संकल्प था! एक निर्मित '* .dll' फ़ाइल वाली वीएस के इतने सारे आउटपुट फ़ोल्डर्स हैं लेकिन सभी काम नहीं कर रहे थे (फ़ंक्शंस निर्यात नहीं कर रहे थे), केवल '.. \ ClassLibrary1 \ bin \ x86 \ Debug' में से एक था। शायद एक नौसिखिया की गलती, लेकिन धन्यवाद: डी –

19

मैं आपको एक लेखक से अनियंत्रित हैक पर भरोसा करने के बजाय दस्तावेजबद्ध तरीके से ऐसा करने की सलाह दूंगा जो समर्थन प्रदान नहीं करता है। आइए इसे उदाहरण के साथ करें:

namespace Publics { 
    public class Class1 { 
     public static void Run() { 
      // Stuff... 
     } 
    } 
} 

अपनी परियोजना में एक नई सी ++/सीएलआई कक्षा पुस्तकालय जोड़ें। समाधान, जोड़ें, नई परियोजना पर राइट-क्लिक करें। "अन्य भाषाएं" नोड, विजुअल सी ++, सीएलआर खोलें, और "क्लास लाइब्रेरी" प्रोजेक्ट टेम्पलेट चुनें। नई परियोजना, गुण, सामान्य गुण, फ्रेमवर्क और संदर्भ राइट-क्लिक करें, नया संदर्भ जोड़ें बटन क्लिक करें। प्रोजेक्ट टैब से, सी # प्रोजेक्ट चुनें जिसका तरीका आप निर्यात करना चाहते हैं।

// TODO टिप्पणी के साथ पहले से बनाई गई खाली वर्ग हटाएँ और कोड के इस प्रकार लिखें:

extern "C" __declspec(dllexport) 
void __stdcall Example() 
{ 
    Publics::Class1::Run(); 
} 

अपने समाधान बनाएँ। जांचें कि उदाहरण फ़ंक्शन को DLL पर dumpbin.exe/निर्यात चलाकर निर्यात किया गया था।आप इस के लिए कुछ इसी तरह देखना चाहिए: नाम और फोन करने के सम्मेलन से परे

 1 0 00001020 [email protected] = [email protected] 

, अब आप भी विकल्प के बहुत सारे निर्यात समारोह tweak करने के लिए है। आप उदाहरण के लिए इस तरह समारोह लिख सकता है आप एक स्थिर विधि के बजाय एक उदाहरण विधि निर्यात करना चाहते हैं:

अगर आप इस विस्तृत बनाने जा रहे हैं
extern "C" __declspec(dllexport) 
void __stdcall Example() 
{ 
    Publics::Class1^ obj = gcnew Publics::Class1; 
    obj->Run(); 
} 

वगैरह, C++/CLI भाषा के साथ कुछ परिचित की आवश्यकता है । आखिरी लेकिन कम से कम नहीं, आपको यह भी पता चल जाएगा कि ग्सेके के आईएल रीराइटर काम करने के आपके मूल प्रयास में क्या गलत हुआ। यह अन्यथा सटीक उसी तकनीक का उपयोग करता है जो सी ++/सीएलआई कंपाइलर प्रबंधित विधि को निर्यात करने के लिए उपयोग करता है।

+2

+1 मैं वास्तव में इस ट्यूटोरियल की सराहना करता हूं। मैंने कुछ सीखा मैंने हमेशा यह माना कि UnmanagedExports कुछ प्रकार का काला जादू कर रहा था। अन्यथा सीखना बहुत अच्छा है। –

+0

यह काम मोनो में करता है? – denfromufa

+0

क्या आपके पोस्ट में डाली गई सी ++/सीएलआई क्लास लाइब्रेरी को संकलित करके मिश्रित मोड असेंबली/डीएलएल से "उदाहरण()" फ़ंक्शन को अनन्य कोड (जैसे डेल्फी, देशी सी ++) से सुलभ किया जाएगा जैसे कि यह एक सामान्य शुद्ध अप्रबंधित था DLL? क्या सीएनआर स्वचालित रूप से तब शुरू होता है जब अप्रबंधित कोड निर्यात किए गए फ़ंक्शन को आमंत्रित करता है? –

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