2013-05-02 92 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

件事帮助: