Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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文件名


你能不能把你的C++代码发布?你应该把调用约定改为<代码> CalpGeNeal.StdCale<代码>。好,我已经更改代码,问题已经解决了。非常感谢。它不回答如何调用C++中的C++(即被损坏的代码)函数。@ Hiang-Agor我不知道什么是代码损坏,如何从C调用它。如果你想完成我的回答,请发表评论,或者你可以发表你自己的答案。@atoMerz我想知道答案:d哦,从我昨天发现的——因为我一直在寻找它——唯一的方法是在dll中找到损坏的名称,并将其写入,而不是通常的名称。但是它当然不会是可移植的,因为名称损坏没有标准化,因此GCC的名称与Visual Studio one不兼容,并且两者都与ICC不兼容,等等。如果您想同时使用这两个编译器,您必须首先尝试一个编译器的函数名,捕获一个异常,因为没有这样的函数,然后尝试下一个编译器的函数名,类似这样。@atoMerz顺便说一句,我觉得有趣的是,是你通过指令
extern“C”{}
解决了这个问题,它只是从对象文件中删除了一个名称损坏,但是你仍然不知道这个名字是什么:D在C++编译器中不能像一个HyLogOLLD.}那样命名一个函数,因为这里可以有两个同名函数来接收不同的参数类型。«Name mangling»就是解决这个问题的方法:它根据自己的算法在函数名后面附加一些符号。这个算法(以及产生的名称)在编译器中有所不同。好的,我已经更改了代码,问题就解决了。非常感谢。动态库中的“HelloWorld”被破坏了,它就不能工作了。@mjb您真的需要“入口点”还是隐式的?我见过不使用它的代码。这是件坏事吗?