2013-05-02 5 views
6

में कॉल करने के लिए कैसे मैंने देव सी ++ में एक डीएलएल लिखा है। डीएलएल का नाम "DllMain.dll" है और इसमें दो कार्य हैं: HelloWorld और ShowMe। हेडर फाइल इस तरह दिखता है:सी ++ डीएलएल को सी #

DLLIMPORT void HelloWorld(); 
DLLIMPORT void ShowMe(); 

और स्रोत फ़ाइल इस तरह दिखता है:

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!\n", "Hi",MB_ICONINFORMATION); 
} 

DLLIMPORT void ShowMe() 
{ 
MessageBox (0, "How are u?", "Hi", MB_ICONINFORMATION); 
} 

मुझे DLL में कोड संकलन और सी # से दो कार्य कहते हैं। सी # कोड इस तरह दिखता है:

[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern void HelloWorld(); 

[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern void ShowMe(); 

जब मैं समारोह "HelloWorld" कहते हैं यह अच्छी तरह से चलाता है और एक संदेशबॉक्स पॉप अप होता है, लेकिन जब मैं फ़ंक्शन को कॉल ShowMe एक EntryPointNotFoundException होता है। मैं इस अपवाद से कैसे बचूं? क्या मुझे हेडर फ़ाइल में extern "C" जोड़ने की आवश्यकता है?

+0

क्या आप अपना सी ++ कोड पोस्ट कर सकते हैं? –

+0

आपको शायद कॉलिंग कन्वेंशन को 'कॉलिंग कन्वेंशन .tdCall' में बदलना चाहिए। – Henrik

उत्तर

7

वी.एस. 2012 में निम्नलिखित कोड ठीक काम किया:

#include <Windows.h> 
extern "C" 
{ 
    __declspec(dllexport) void HelloWorld() 
    { 
     MessageBox (0, L"Hello World from DLL!\n", L"Hi",MB_ICONINFORMATION); 
    } 
    __declspec(dllexport) void ShowMe() 
    { 
     MessageBox (0, L"How are u?", L"Hi", MB_ICONINFORMATION); 
    } 
} 

नोट: अगर मैं extern "C" को दूर मैं अपवाद मिलता है।

+0

ठीक है, मैंने कोड बदल दिया है और समस्या हल हो गई है। बहुत धन्यवाद। – user1333098

+3

यह जवाब नहीं देता है कि सी # + (यानी मैंगलेड कोड) को सी # से कैसे कॉल करें। –

+0

@ हाय-एंजेल मुझे नहीं पता कि एक उलझन कोड क्या है और इसे सी # से कैसे कॉल करें। अगर आप मेरा जवाब पूरा करना चाहते हैं तो कृपया एक टिप्पणी पोस्ट करें या आप अपना उत्तर पोस्ट कर सकते हैं। – atoMerz

1
using System; 
using System.Runtime.InteropServices; 

namespace MyNameSpace 
{ 
    public class MyClass 
    { 
     [DllImport("DllMain.dll", EntryPoint = "HelloWorld")] 
     public static extern void HelloWorld(); 

     [DllImport("DllMain.dll", EntryPoint = "ShowMe")] 
     public static extern void ShowMe(); 
    } 
} 
+1

ठीक है, मैंने कोड बदल दिया है और समस्या हल हो गई है। बहुत धन्यवाद। – user1333098

+2

यह गतिशील पुस्तकालय में "हैलोवर्ल्ड" के रूप में काम नहीं करेगा, उलझन में है। –

1

चीजें हैं जो मदद की:

  • : extern "सी" {समारोह ज फ़ाइल में घोषणाओं यहाँ} सी ++ नाम एन्कोडिंग अक्षम हो जाएगा। इसलिए ग # समारोह सी घोषणा या सी # घोषणा

  • शायद स्ट्रिंग प्रकार के रूप में BSTR/_bstr_t उपयोग करें और अन्य vb प्रकार का उपयोग में CallingConvention.Cdecl के लिए

  • उपयोग __stdcall मिल जाएगा। http://support.microsoft.com/kb/177218/EN-US

  • डाउनलोड "PInvoke इंटरॉप सहायक" 3 टैब = C# घोषणा में ज फ़ाइल से https://clrinterop.codeplex.com/releases/view/14120 पेस्ट समारोह घोषणा। डीएलएल फ़ाइल नाम के साथ प्रतिस्थापित करें।

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