2010-06-08 11 views
5

मुझे एक सी ++ डीएल मिला जिसे सी # प्रोजेक्ट में एकीकृत किया जाना है।सी # परियोजना में सी ++ डीएलएल का उपयोग

मुझे लगता है कि मुझे ऐसा करने का सही तरीका मिल गया है, लेकिन डीएल को कॉल करने से मुझे यह त्रुटि मिलती है: सिस्टम। बैड इमेजफॉर्मैट अपवाद: किसी प्रोग्राम को गलत प्रारूप के साथ लोड करने का प्रयास किया गया था। (HRESULT से अपवाद: 0x8007000B)

इस dll में समारोह है:

extern long FAR PASCAL convert (LPSTR filename); 

और यह कोड मैं में उपयोग कर रहा हूँ है सी #

namespace Test{ 
public partial class Form1 : Form 
{ 
    [DllImport("convert.dll", SetLastError = true)] 
    static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // generate textfile 
     string filename = "testfile.txt"; 

     StreamWriter sw = new StreamWriter(filename); 
     sw.WriteLine("line1"); 
     sw.WriteLine("line2"); 
     sw.Close(); 

     // add checksum 
     Int32 ret = 0; 
     try 
     { 
      ret = convert(filename); 

      Console.WriteLine("Result of DLL: {0}", ret.ToString()); 
     } 
     catch (Exception ex) 
     { 
      lbl.Text = ex.ToString(); 
     } 
    } 
}} 

में आगे बढ़ने के कोई भी विचार इसके साथ?

धन्यवाद एक बहुत, फ्रैंक

उत्तर

4

कोशिश समारोह DLL से निर्यात में __stdcall (या WINAPI या APIENTRY) का उपयोग करने के लिए: नेट क्रम कि के बारे में पता है, तो इस प्रकार अपने सी # विधि हस्ताक्षर को संशोधित करने की जरूरत है।

+0

वह पहले से ही है। WinDef.h '# परिभाषित करें PASCAL __stdcall' –

+0

मुझे डीएल" जैसा है "का उपयोग करना है ... – Frank

+0

में कोई बदलाव नहीं है, अलग-अलग शीर्षकों (WinDef.h में भी) में PASCAL की अलग-अलग घोषणाएं हैं, लेकिन' __stdcall' को उसी तरह से समझा जाएगा – Oleg

4

अपने सी # कोड (गुण संवाद में) 86 के लिए AnyCPU से स्विच करने का प्रयास।

+0

इसी परिणाम ... सिस्टम। बैड इमेजफॉर्मैट अपवाद: गलत प्रोग्राम के साथ प्रोग्राम लोड करने का प्रयास किया गया था।(HRESULT से अपवाद: 0x8007000B) – Frank

+1

@ फ्रैंक: डीएलएल और सी # कोड में अपवाद बिंदु x86/x64 मेलसमूह। यदि सी ++ कोड x64 के रूप में संकलित किया गया है, तो सी # कोड को x64 पर भी सेट करने का प्रयास करें (और इसके विपरीत यदि कोड x86 है)। DllImport से निपटने पर, यह केवल अपवाद का कारण है (माइक्रोसॉफ्ट प्रलेखन के अनुसार - http://msdn.microsoft.com/en-us/library/system.badimageformatexception.aspx)। –

4

आपका निर्यात किया गया फ़ंक्शन PASCAL कॉलिंग कन्वेंशन का उपयोग करता है, जो विंडोज में stdcall जैसा ही है।

[DllImport("convert.dll", SetLastError = true, CallingConvention=CallingConvention.StdCall)] 
static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename); 
+0

वहाँ एक था) पहली पंक्ति में बहुत अधिक है, इसलिए इस हटाया: [DllImport ("convert.dll", SetLastError = सच है, CallingConvention = CallingConvention.StdCall)] स्थिर निर्वासन Int32 परिवर्तित ([MarshalAs (UnmanagedType.LPStr)] स्ट्रिंग फ़ाइल नाम); लेकिन फिर भी वही त्रुटि सिस्टम। बैड इमेजफॉर्मैट अपवाद: किसी प्रोग्राम को गलत प्रारूप के साथ लोड करने का प्रयास किया गया था। (HRESULT से अपवाद: 0x8007000B) – Frank

+1

क्या आप कृपया अपने प्लेटफ़ॉर्म, प्रोजेक्ट सेटिंग्स और डीएलएल के बारे में कुछ और विवरण दे सकते हैं। (आर्किटेक्चर x86/x64 आदि) –

0

दो मुख्य चरण शामिल हैं

1- एक सी बनाना ++ dll

दृश्य स्टूडियो में

**New->Project->Class Library** in c++ template Name of project here is first_dll in visual studio 2010. Now **declare your function as public** in first_dll.h file and write the code in first_dll.cpp file as shown below. 

Header File

Cpp File

Check **Project-> Properties -> Configuration/General -> Configuration Type** 
this option should be **Dynamic Library(.dll)** and build the solution/project now. 

first_dll.dll फ़ाइल डीबग फ़ोल्डर में बनाई गई है

2- सी # परियोजना में यह लिंक करना

ओपन सी # परियोजना

Rightclick on project name in solution explorer -> Add -> References -> Browse to path 
where first_dll.dll is created and add the file 

में शीर्ष पर इस पंक्ति जोड़ें सी # परियोजना

Using first_dll; 

अब फाइल कुछ समारोह

double var = Class1.sum(4,5); 

मैं जुड़ा हुआ .dll सी # VS2013 में बनाया परियोजना के लिए VS2010 में बनाया सी ++ परियोजना में बयान नीचे का उपयोग कर पहुँचा जा सकता है। यह अच्छा काम करता है।

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