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

use*_*098 14 c# dll

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

DLLIMPORT  void HelloWorld();
DLLIMPORT void ShowMe();
Run Code Online (Sandbox Code Playgroud)

源文件如下所示:

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

DLLIMPORT void ShowMe()
{
 MessageBox (0, "How are u?", "Hi", MB_ICONINFORMATION);
}
Run Code Online (Sandbox Code Playgroud)

我将代码编译成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();
Run Code Online (Sandbox Code Playgroud)

当我打电话功能的"HelloWorld",它运行良好,弹出一个消息框,但是当我调用该函数ShowMeEntryPointNotFoundException发生.我该如何避免这种异常?我是否需要添加extern "C"头文件?

ato*_*erz 13

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果我删除extern "C"我得到的例外.

  • 它没有回答如何从C#调用C++(即受损代码)函数. (7认同)

mjb*_*mjb 6

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它不会工作,因为动态库中的“HelloWorld”被破坏了。 (2认同)