如何调用C ++ DLL在C#(How to call C++ DLL in C#)

2019-09-01 17:39发布

我已经写在开发的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”,它运行良好,弹出一个消息框,但是当我调用该函数ShowMeEntryPointNotFoundException发生。 如何避免此异常? 我是否需要添加extern "C"头文件?

Answer 1:

在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"我得到异常。



Answer 2:

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


Answer 3:

事情帮助:

  • 的:为extern“C” {函数声明在这里.h文件}将禁用C ++名编码。 所以C#会发现功能

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

  • 也许使用BSTR / _bstr_t的字符串类型和使用其他类型的VB。 http://support.microsoft.com/kb/177218/EN-US

  • 下载“的PInvoke互操作助理” https://clrinterop.codeplex.com/releases/view/14120从第三个标签= C#声明.h文件中粘贴函数声明。 与DLL文件名代替。



文章来源: How to call C++ DLL in C#
标签: c# dll