C# 如何调用C++;C语言中的动态链接库# 我在DeV C++中编写了一个DLL。DLL的名称为“DllMain.DLL”,它包含两个函数:HelloWorld和ShowMe。头文件如下所示: 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); } [DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void HelloWorld(); [DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void ShowMe();
源文件如下所示:C# 如何调用C++;C语言中的动态链接库# 我在DeV C++中编写了一个DLL。DLL的名称为“DllMain.DLL”,它包含两个函数:HelloWorld和ShowMe。头文件如下所示: 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); } [DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void HelloWorld(); [DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void ShowMe();,c#,dll,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)
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);
}
[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void HelloWorld();
[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void ShowMe();
我将代码编译成DLL,并从C#调用这两个函数。C代码如下所示:
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);
}
[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void HelloWorld();
[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void ShowMe();
当我调用函数“HelloWorld”时,它运行良好并弹出一个消息框,但当我调用函数
ShowMe
时,会出现EntryPointNotFoundException
异常。如何避免此异常?是否需要在头文件中添加extern“C”
#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);
}
}
#包括
外部“C”
{
__declspec(dllexport)void HelloWorld()
{
MessageBox(0,L“Hello World from DLL!\n”,L“Hi”,MB_图标信息);
}
__declspec(dllexport)void ShowMe()
{
消息框(0,L“你好吗?”,L“你好”,MB_图标信息);
}
}
注意:如果我删除extern“C”
我会得到异常。有助于:
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();
}
}
-
<> >:h文件中的“C”{函数声明将禁用C++名称编码。所以c#会找到函数
- 将_stdcall用于C声明或调用中的convention.Cdecl C#声明
- 可能使用BSTR/\u BSTR\t作为字符串类型,并使用其他vb类型
- 下载“PInvoke互操作助手” 从第三个选项卡中的.h文件粘贴函数声明=c# 宣言。替换为dll文件名
extern“C”{}
解决了这个问题,它只是从对象文件中删除了一个名称损坏,但是你仍然不知道这个名字是什么:D在C++编译器中不能像一个HyLogOLLD.}那样命名一个函数,因为这里可以有两个同名函数来接收不同的参数类型。«Name mangling»就是解决这个问题的方法:它根据自己的算法在函数名后面附加一些符号。这个算法(以及产生的名称)在编译器中有所不同。好的,我已经更改了代码,问题就解决了。非常感谢。动态库中的“HelloWorld”被破坏了,它就不能工作了。@mjb您真的需要“入口点”还是隐式的?我见过不使用它的代码。这是件坏事吗?