`

c#调用C++的DLL找不到入口点

阅读更多


C++源码如下:
—————————————————a.h—————————————————
#ifdef A_EXPORTS
#define A_API __declspec(dllexport)
#else
#define A_API __declspec(dllimport)
#endif

A_API int F(void);
—————————————————a.cpp—————————————————

#include "stdafx.h"
#include "a.h"
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
 )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
    return TRUE;
}

A_API int F(void)
{
MessageBox(NULL, "1212", "1212", MB_OK);
return 0;
}

C#源码函数原型声明:

[DllImport("a.dll")]
public extern static int F();
调用后提示找不到入口点

在命令行用dumpbin /exports 看函数名:

dumpbin /exports a.dll
函数名不是"F"?而是"?F@@YAHXZ"

C#函数声明写成:

[DllImport("a.dll",EntryPoint="?F@@YAHXZ")]
public extern static int F();

这样调用成功!

原因:在C++函数声明时要将 extern "C" 添加在 DLL 函数声明之前

主要注意包含 DllImport 的代码行。此代码行根据参数值通知编译器,使之声明位于 User32.dll 中的函数并将签名中出现的所有字符串(如参数或返回值)视为 Unicode 字符串。如果缺少 EntryPoint 参数,则默认值为函数名。另外,由于 CharSet 参数指定 Unicode,因此公共语言运行库将首先查找称为 MessageBoxW(有 W 是因为 Unicode 规范)的函数。如果运行库未找到此函数,它将根据调用约定查找 MessageBox 以及相应的修饰名。受支持的调用约定只有 __cdecl 和 __stdcall。
当调用用户定义的 DLL 中所包含的函数时,,如下所示:
// The function declaration in SampleDLL.h file
extern "C" SAMPLEDLL_API int fnSampleDLL(void);

Dumpbin.exe位于 VS的安装目录\VC\bin下,如果点击dumpbin.exe提示
出现mspdb80.dll无法找到的情况,是因为VC\Bin\下没有 “msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”这四个文件(在VS2005中并没有这四个文件),解决的方法:
1>直接从Common7\IDE\下复制这四个文件到VC\Bin\下即可解决
2>添加系统变量 (Path),这样:我的电脑->属性->高级->环境变量->系统变量,在path中添加C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;,注意结尾最后用“;”隔开!
这样在用ml编译就不会出现mspdb80.dll文件找不到的错误了
0
0
分享到:
评论

相关推荐

    c#调用c++DLL,dll有二维数组

    标题中的“c#调用c++DLL,dll有二维数组”意味着我们将在C++的DLL中定义一个二维数组,然后在C#中调用该函数并处理这个数组。在C++中,二维数组通常以指针的形式传递,因为C++不支持引用参数。而在C#中,我们通常...

    C#调用C++DLL导出类

    总结来说,C#调用C++DLL中的类主要涉及以下几个步骤: 1. 在C++DLL中定义导出类及其方法。 2. 在C#中使用DllImport加载DLL,并定义C风格的函数接口。 3. 创建一个C#托管类,持有C++对象的指针,并提供相应的C#方法...

    C#调用C++ Dll关于结构体数组引用的传递及解析使用的展示代码

    ### C#调用C++ DLL:结构体数组引用的传递及解析使用详解 #### 引言 在跨语言编程环境中,经常会遇到不同编程语言之间进行交互的需求。C#与C++之间的互操作就是一个典型场景。当C#需要调用C++开发的动态链接库...

    C# 调用C++DLL(函数参数包含指针)

    总结来说,C#调用C++DLL并处理指针参数涉及到P/Invoke、函数原型声明、指针类型映射、内存管理和异常处理等多个环节。理解这些细节是成功进行跨语言互操作的关键。在实际开发中,务必确保所有操作都遵循安全规范,以...

    c#调用c++ dll 传参 string 崩溃的一种解决办法

    ### c#调用c++ dll 传参 string 崩溃的一种解决办法 在跨语言编程环境中,我们经常需要在不同编程语言之间进行交互。一个常见的场景是C#调用C++编写的动态链接库(DLL)。然而,在这种情况下可能会遇到一些问题,...

    C#调用C++DLL动态库.rar_C#调用C++DLL动态库_c++dll动态库_c++开发动态库

    C#调用C++ DLL时可能会遇到异常,例如找不到DLL或函数,或者参数不匹配。因此,需要适当的错误处理机制,例如使用`try-catch`块。 7. **平台兼容性**: 跨平台开发时,需要注意C++ DLL是否适用于目标平台(如x86...

    C#调用C++动态DLL

    总的来说,调用C++动态DLL在C#中是一项复杂但重要的任务,它涉及到跨语言的接口定义、平台调用、异常处理以及数据类型转换等多个环节。理解并熟练掌握这些步骤,将有助于你构建更强大的跨语言应用程序。

    C#调用C++的动态库Dll示例(含UsbLibDotNet使用)

    1.C#调用C++封装的动态库dll 2.结构体含union共同体的C++转C#示例 3.C#结构体指针的调用演示 4.C#读取USB数据设备的示例 5.C#动态调用C++dll库示例 6.C#静态调用C++dll库示例 注意:UsbLibDotNet使用时候需要先安装...

    C#调用 C++dll(包含传递自定义结构数组)

    当C#调用C++dll时,需要传递自定义结构的数组,该怎么办? 示例给出了方案

    C#调用C++ Dll

    总结,C#调用C++ DLL涉及的关键点包括: 1. 定义与C++函数签名匹配的委托类型。 2. 使用`DllImport`特性加载和调用DLL函数。 3. 在需要的时候,使用`unsafe`上下文和`fixed`关键字处理指针。 4. 注意调用约定(如`...

    VS2015 C# 调用C++Dll 附C++源文件

    本教程将详细解释如何在Visual Studio 2015(VS2015)中实现C#调用C++Dll,并附带C++源文件和说明文档。 首先,我们要理解`DllImport`属性是.NET框架提供的一种机制,它允许C#代码调用非托管代码,也就是C++的函数...

    c# 调用C++编写 的DLL函数各种参数传递问题。

    这篇文章将详细介绍 C# 调用 C++ 编写的 DLL 函数各种参数传递问题,包括不返回值的参数、带返回值的参数、传递结构体指针和传递结构体数组等。 1. 不返回值的参数 在 C++ 中,函数原型为 bool SendNewSms(char *...

    C#调用C++的DLL

    在.NET框架中,C#是一种常用的...总的来说,C#调用C++DLL涉及了P/Invoke、数据类型映射、错误处理等多个方面,理解这些概念和技巧对于跨语言编程至关重要。实际操作时,还需要根据具体DLL的接口和需求进行适配和调整。

    C#调用C++ DLL 托管

    - 确保C++ DLL和C#应用程序在同一目录下,或者在系统路径中,否则`DllImport`会找不到DLL。 - 如果C++函数有返回值或参数是自定义类型,需要考虑数据类型的映射,比如指针、结构体等。 - `CallingConvention`可以...

    C#使用CLR调用C++的DLL库

    本主题将详细介绍如何在C#应用中利用CLR调用C++编写的DLL库,特别是在Windows环境下。我们将分为三个关键步骤进行讲解: 1. **创建C++ DLL库** - 首先,你需要创建一个C++动态链接库(DLL)项目。在Visual Studio...

    C#Winform动态调用C++和C#的Dll

    本文将重点讲解如何在C#的Winform应用中动态调用C++和C#编写的DLL,并将DLL作为嵌入资源处理,避免因丢失DLL文件而引发的问题。 首先,我们需要理解DLL的工作原理。DLL文件包含可执行代码和数据,当一个应用程序...

    C#调用C++DLL

    C#调用C++的DLL,很多地方有重要的应用,比如高性能计算方面,C++具有优势,这只是一个简单的调用函数,讲解了怎样使用VC++生成DLL,然后采用C#调用,备忘录而已,免积分,您觉得有价值可以给5分哦

    C#调用c++函数的dll文件,同时实现c++调用c#函数

    本示例展示了如何在C#和C++之间实现互操作性,即C#调用C++编写的动态链接库(DLL)函数,同时C++也能调用C#的方法。这主要依赖于.NET框架提供的互操作特性,如C++/CLI(C++的.NET版本)和P/Invoke(Platform Invoke...

    C#调用C++ dll 传入字符参数

    在跨语言编程中,有时我们需要在C#应用中调用C++编写的动态链接库(DLL)。这种情况通常出现在利用C++的性能优势或者利用已有的C++库时。本篇文章将详细探讨如何在C#中调用C++ DLL,并特别关注如何传入字符参数。 ...

    C#_VS2005调用C++DLL

    本文将深入探讨如何在C#(使用Visual Studio 2005)环境下调用C++编写的动态链接库(DLL)。这个主题涉及到的知识点包括:C#的平台调用服务(P/Invoke)、C++ DLL导出函数、数据类型转换以及托管与非托管代码的交互...

Global site tag (gtag.js) - Google Analytics