VS2017自己用C++写的DLL,用C#调用出错,找不到入口,请各位大佬帮忙看下

独伴丶梨花影 2020-07-08 04:19:29
这是C++的头文件代码:


这是C++的CPP文件代码:


这是C#的代码

环境都是VS2017DE X64
...全文
2328 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
独伴丶梨花影 2020-08-15
  • 打赏
  • 举报
回复
引用 2 楼 OrdinaryCoder 的回复:
1.感觉你Vision_API宏好像定义错了
直接这么定义函数吧 extern "C" __declspec(dllexport) int __stdcall add(int x,int y);
2.看看C++工程是否有.def 文件 把对外的函数名粘贴进去


引用 6 楼 Null_Link 的回复:
[DllImport("Dll1.dll", EntryPoint = "add1")]
public static extern int add1(int a,int b);

感谢!
Null_Link 2020-08-14
  • 打赏
  • 举报
回复
[DllImport("Dll1.dll", EntryPoint = "add1")]
public static extern int add1(int a,int b);
gd6321374 2020-07-08
  • 打赏
  • 举报
回复
天天写这种的,给你个例子

#ifndef CallReader	
#define CallReader			__stdcall
#else
#define	CallReader			__cdecl
#endif

#ifdef	READER
#define ReaderDLL			extern "C"	__declspec(dllexport)
#else
#define	ReaderDLL			extern "C"	__declspec(dllimport)
#endif
ReaderDLL int CallReader ReadAPlus(UCHAR addr, UCHAR block, UCHAR blockCount, UCHAR dataStream[], UCHAR *dataStreamLength, UCHAR maxLen);


ReaderDLL int CallReader ReadAPlus(UCHAR addr, UCHAR block, UCHAR blockCount, UCHAR dataStream[], UCHAR *dataStreamLength, UCHAR maxLen)
{
	int packLength = 0, status = 0, ik = 0;
	UCHAR packBuffer[128] = {0};

	USBHidExitCommunicate();
	for(ik=0; ik<3; ik++)
	{
		status = USBHidInitCommunicate();
		if(status == DEVICE_ERROR_OK)
			break;

		Sleep(10);
	}

	if(ik == 3)
		return DEVICE_ERROR_NO_CONNECT;

	packBuffer[0] = 0;
	packBuffer[1] = blockCount;
	packBuffer[2] = block;

	status = USBCommandPacketDataTransfer(addr, 0, CMD_APLUS_HLRead, packBuffer, 9);
	if(status)
		return status;

	status = USBCommandReceivePacketData(packBuffer, &packLength, sizeof(packBuffer));
	if(status)
		return status;

	int dataLength = (packBuffer[OFFSET_DATALENGTH_H] << 8) + packBuffer[OFFSET_DATALENGTH_L] - 1;
	if(dataLength > maxLen)
		return DEVICE_ERROR_OUT_OF_SIZE;

	if(packBuffer[OFFSET_STATUS] != OFFSET_STATION)
		return packBuffer[OFFSET_STATUS];

	dataStreamLength[0] = dataLength;
	memcpy(dataStream, &packBuffer[OFFSET_DATA_BEGIN + 8], dataStreamLength[0]);

	return DEVICE_ERROR_OK;
}
C# 调用


     [DllImport("ICReader.dll", EntryPoint = "ReadAPlus", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
     public static extern int ReadAPlus(byte addr, byte block, byte blockCount, ref byte dataStream, ref byte dataStreamLength, byte maxLen);

github_36000833 2020-07-08
  • 打赏
  • 举报
回复
引用 2 楼 OrdinaryCoder 的回复:
... 直接这么定义函数吧 extern "C" __declspec(dllexport) int __stdcall add(int x,int y); ...
+1 c++会对导出函数进行“名字修饰”(name mangling)。比如add1导出可能被修饰成类似"?add1@@YAXHD@Z"之类的名字。 因此,你要用extern "C" 来告诉编译器不要mangling。 查看导出可以用dumpbin.exe(再VisualStudio命令行下就有)。 dumpbin.exe /EXPORTS Dll1.dll
OrdinaryCoder 2020-07-08
  • 打赏
  • 举报
回复
补一条 你在C#声明的时候 没有定义C++函数名 那么C#函数名应该和C++函数名一样吧 C#是Add C++Add1 是不是就不对了
OrdinaryCoder 2020-07-08
  • 打赏
  • 举报
回复
1.感觉你Vision_API宏好像定义错了 直接这么定义函数吧 extern "C" __declspec(dllexport) int __stdcall add(int x,int y); 2.看看C++工程是否有.def 文件 把对外的函数名粘贴进去
独伴丶梨花影 2020-07-08
  • 打赏
  • 举报
回复
add改成add1也是一样的,报一样的错误

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧