2013-05-28 2 views
7

में C++ DLL लोड हो रहा है, तो मेरे पास एक अप्रबंधित C++ DLL है जिसे मैं C# exe के भीतर से कॉल करना चाहता हूं। मैंने संभावित समाधानों को देखा, और मुझे ऐसा लगता है कि सी ++/सीएलआई का उपयोग अप्रबंधित सी ++ वर्ग के लिए एक रैपर के रूप में करना है। इसलिए मैंने एक सी ++/सीएलआई कक्षा लिखी जो इस तरह दिखती है, और एक डीएलएल में संकलित हो जाती है (मुझे पता है कि इसमें एक विनाशक और फाइनेंजर होना चाहिए, लेकिन अब तक कोड मुख्य समारोह में नहीं मिलेगा, इसलिए मैंने उन्हें बाहर रखा सादगी की खातिर):EEFileLoadException जब प्रबंधित DLL

#include <cppheader.h> 

using namespace System; 

namespace DependencyInterface 
{ 
    public ref class DependencyTester 
    { 
    public: 
    DependencyTester() 
    { 
     _class = new CPPClass(); 
    } 

    private: 
    CPPClass* _class; 
    }; 
} 

मैं तो एक सी # निष्पादन योग्य है कि इस तरह दिखता है:

First-chance exception at 0x000007fefd5a9e5d in DependencyTest2.exe: Microsoft C++ exception: EEFileLoadException * __ptr64 at memory location 0x0094ca58.. 
: दुर्भाग्य से

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using DependencyInterface; 

namespace DependencyTest2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DependencyTester tester; 
     } 
    } 
} 

, जब मैं कोशिश करते हैं और कोड चलाने के लिए, मैं निम्नलिखित C++ अपवाद मिल

मैंने सेट करने की कोशिश की मुख्य की पहली पंक्ति पर एक ब्रेकपॉइंट, लेकिन निष्पादन उस बिंदु तक पहुंचने से पहले अपवाद फेंक दिया जाता है। अगर मैं "जारी रखता हूं" (मैं एमवीएस 2010 का उपयोग कर रहा हूं) मुझे यह मिलता है:

First-chance exception at 0x76d8c5e2 in DependencyTest2.exe: 0xC0000005: Access violation reading location 0x0000000000000020. 

क्या किसी के पास कोई सलाह है? यह विंडोज 7 x64 पर है, और सब कुछ x64 के लिए संकलित किया गया है जिसमें सी ++ डीएलएल शामिल है।

+1

मुझे कॉल करने के लिए स्टैक ट्रेस देखने की ज़रूरत है। लेकिन पहले अपने डीबगर को प्रबंधित मोड में स्विच करें ताकि आप वास्तविक प्रबंधित अपवाद देख सकें। –

उत्तर

6

एक ईईफ़ाइल लोड अपवाद यह इंगित करता है कि निष्पादन योग्य इसकी किसी भी निर्भरता को ढूंढ या लोड नहीं कर सकता है। यह निश्चित रूप से विभिन्न कारणों (पथ समस्या, मिश्रण विन्यास, मिश्रण प्लेटफॉर्म) कर सकते हैं।

एक अच्छी शुरुआत आपके डीएलएल/एक्जिक्यूटिव पर निर्भरता वॉकर (x64 संस्करण का उपयोग करना सुनिश्चित करें) का उपयोग कर रही है।

+0

व्हाउ, जो हमेशा के लिए लिया! हाँ, समस्या कुछ लाइब्रेरी के साथ थी जो मेरी सी ++ लाइब्रेरी में जुड़ा हुआ था। –

1

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

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