2013-05-02 138 views
6

我已經在dev C++中編寫了一個DLL。該DLL的名稱是「DllMain.dll」,它包含兩個函數:HelloWorldShowMe。頭文件看起來是這樣的:如何在C中調用C++ DLL#

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,並調用從C#這兩種功能。 C#代碼如下所示:

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

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

當我打電話功能的「HelloWorld」,它運行良好,彈出一個消息框,但是當我調用該函數ShowMeEntryPointNotFoundException發生。我如何避免這種異常?我需要在頭文件中添加extern "C"嗎?

+0

請問您可以發佈您的C++代碼嗎? – 2013-05-02 09:20:22

+0

您應該將調用約定更改爲「CallingConvention.StdCall」。 – Henrik 2013-05-02 10:57:11

回答

7

在VS 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 2013-05-03 06:54:37

+3

它不回答如何從C#調用C++(即損壞的代碼)函數。 – 2014-10-01 15:15:07

+0

@ Hi-Angel我不知道什麼是破損的代碼,以及如何從C#調用它。如果您想完成我的答案,請發表評論,或者您可以發佈自己的答案。 – atoMerz 2014-10-01 19:43:48

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 2013-05-03 06:55:02

+2

由於動態庫中的「HelloWorld」被破壞,它將不起作用。 – 2014-10-01 15:40:09

1

件事幫助: