C#调用C++下Win32DLL,找不到入口问题,感谢TallMan

c#调用C++DLL不到入口点以及衍生的相关问题 DllImport属性详解 API函数是构筑Windows的基石, 是Windows编程的必备利器。每一种Windows应用程序开发工具都提供间接或者直接的方式调用Win32APIC#也不例外。使用Win32API的一个好处就是,我们可以实现更多的功能。 首先,要引入命名空间:using System.Runtime.InteropServices; 然后,声明在程序中所要 阅读详情

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

c#调用C++DLL EntryPointNotFoundException 不到入口 c#程序调用C++dll的时候,经常出现这样的问题: System.EntryPointNotFoundException:Unable to find an entry point 代码:   [DllImport("LibUsb.dll", EntryPoint = "USB_lib_Open", CharSet = CharSet.Unicode)] internal sta 阅读详情

相关推荐

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——————————————...

weixin_30594001的博客 361

C#调用DLL时出现的错误(个人总结向)

C#调用DLL时出现的错误前言1.环境配置问题1.1 无法加载*.dll,不到指定的模块2.DLL程序问题2.1 无法在dll入口点2.2 在C#中捕捉DLL中函数异常2.3 Invalid address specified to RtlValidateHeap2.4 DLL编译3.C#调用问题3.1 尝试读取或写入受保护的内存3.2 C# 调用dll出现托管问题3.3 参数不一致3.4 调用带传出数组函数4.其他4.1 warning C4819: 该文件包含不能在当前代码页中表示的字符4.2

Blogger of Bao 1万+

System.EntryPointNotFoundException: 未发现入口点。

1.今天在把MVC3.0升级到MVC4.0的时候,运行项目,出现了这个问题。报错如下“/”应用程序中的服务器错误。 未发现入口点。 说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.EntryPointNotFoundException: 未发现入口点。 源错误: 执行当前

织梦行云 1万+

关于DLL不到函数入口点的问题

在隐式调用DLL时,运行时有时会出现 一个对话框。说某某函数不到入口点。分析了一下,原因不外乎以下几种,供参考1、输入函数的DLL与LIB版本不匹配。检查一下二者是否是统一的。2、有否加载了一个库所有的“父库”    这个“父库”是我的叫法。他的意思是:当A.DLL的实现会加载B.DLL。则B.DLL为A.DLL的父库倘若我们的应用程序只需加载A.DLL,那么编译的时候是不会

ytfrdfiw的专栏 1万+

无法到c语言dll入口点,c# – 无法在DLL入口

我有一个C#应用程序,我试图将参数发送到C函数.但是,我收到了错误(在主题中提到)C#应用程序:static class SegmentationFunctions{[DllImport("MyApplication.dll", EntryPoint = "fnmain", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet...

weixin_32048835的博客 1590

C#调用C++类库dll,无法到函数入口(无法在“***.dll“中到名为“***“的入口点)

问题: 在使用C#DllImport调用C++编写的类库dll时候,出现不到函数入口点。 C++dll函数名 #ifdef DLLCLASS_EXPORT #define EXT_CLASS __declspec(dllexport) #else #define EXT_CLASS _declspec(dllimport) #endif extern "C" EXT_CLASS class CBaseInterface { public: virtual int SetPara.

王小波门下走狗 1万+

c#调用c++dll不到入口点,一秒搞定

看了那么多人在网上解决这个问题。我即

Physics_ITBoy的专栏 2084

C#调用C++dll文件 运行提示不到函数的入口

1、首先用DllAnalyzer查看dll的输出函数名,发现输出的函数名有所变化,多了@xxx和一些别的奇怪的字符,实际上是因为C++重载机制造成的,使用使用extern "C"关键字即可 2、WINAPI形式的函数在未使用DEF文件的情况下导出的名称后面会带有@xxx 形式的修饰,def文件编写完后在 连接器->输入->模块定义文件 定义一下

Eric Qu 个人专栏 4931

C#调用C语言生成的DLL“未入口

自己开始采用的是第一种dll的生成方式,然后出现"未入口"的错误,修改为采用。.def的方法,解决了这个错误,但是出现了新的问题:“函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。”自己感觉应该是可以到函数的入口,但是形参或者类型出现了不匹配的问题

无敌三脚猫的专栏 1955

System.EntryPointNotFoundException:“无法在 DLL“xxxx.dll”中到名为“yyyy”的入口点。”

方法一:检查自己的入口函数名是否填对,粗心过一次填错了 TnT 。 方法二:检验自己目录下的pmsif.dll是否是自己真实需要调用DLL文件,使用depends.exe打开查看函数是否有自己要调用的函数入口。 我电脑上有两个DLL,一个68k,一个72k,如果没有大小区别,很难想到是引用的DLL版本不对导致无法到函数入口点。 方法三:替换一个DLL文件,DLL文件可能已经损坏,尝试反编译,结...

汪锦鹏的博客 1万+

C#调用非托管代码"不到入口点"解决办法

原因:在C++函数声明时要将 extern "C" 添加在 DLL 函数声明之前。 [DllImport("a.dll")]public extern static int F();调用后提示不到入口点 在命令行用dumpbin /exports 看函数名:,或用exeScope查看导出的接口dumpbin /exports a.dll函数名不是"F"?而是"?F@@YAHXZ"...

weixin_34410662的博客 467

pdf2Image.dll丢失怎么解决?pdf2Image.dll修复工具下载

pdf2Image.dll如何修复?pdf2Image.dll是电脑内十分重要的文件,它的丢失易导致游戏、应用软件等程序运行出现错误,致使程序无法正常运行,它的解决办法也是非常简单的,只要下载好pdf2Image.dll文件,放置在对应系统的目录下面,运行补丁即可让程序正常运行它是一个电脑系统中必不可少、非常重要的dll文件,对于系统来说缺少相关文件至关重要,这时此dll文件就派上用场了若你的电脑不小心丢失了这个文件那可就麻烦了。 pdf2image.dll如何修复 1、从本站下载pdf2image.d

qdx698767896的博客 3342

C#调用C DLL笔记,提示:无法在 DLL“xxx.dll”中到名为“xxxx”的入口

C#调用C++ dll很多,度娘一搜一大堆,还是没有解决,特写此笔记备忘 报错截图如下: 原因是C程序没有提供外部调用入口,打开.h头文件源码 如下图 C#调用C程序char数组报错:无法封送处理“return value”: 无效的托管/非托管类型组合 改为IntPtr接收 用Marshal.Copy将IntPtr转byte[] 注意:根据操作系统位数编译对应C程序的32 dll或64位dll anycpu调用报错 修改目标平台为x64 加微...

mansai的专栏 6440

.NET-C#类库用regsvr32注册,不到入口点的问题

C#类库用regsvr32注册,不到入口点的问题方法!

相信相信的力量 2万+
上一篇: 美好回忆
下一篇: 如何让一些安装软件等的disabled的按钮启用,
太愚散人
博客等级 码龄19年 28粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值