如何在C#中调用C ++ DLL

时间:2013-05-02 07:35:42

标签: c# dll

我在开发C ++中编写了一个DLL。 DLL的名称是“DllMain.dll”,它包含两个函数:HelloWorldShowMe。头文件如下所示:

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”时,它运行良好并弹出一个messageBox,但是当我调用函数ShowMe时,会出现EntryPointNotFoundException。我该如何避免这种异常?我是否需要在头文件中添加extern "C"

3 个答案:

答案 0 :(得分:10)

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",我会获得例外。

答案 1 :(得分:3)

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();
    }
}

答案 2 :(得分:2)

有帮助的事情:

  • :extern&#34; C&#34; {h file}中的{function declarations}将禁用C ++名称编码。所以c#将找到函数

  • 使用__stdcall作为C声明或CallingConvention.Cdecl C#声明

  • 可能使用BSTR / _bstr_t作为字符串类型并使用其他vb类型。 http://support.microsoft.com/kb/177218/EN-US

  • 下载&#34; PInvoke Interop助理&#34; https://clrinterop.codeplex.com/releases/view/14120 在第3个选项卡中从.h文件粘贴函数声明= c# 宣言。用dll filename替换。