一开始将C++的程序编译成了DLL,然后在自己的C#程序里调用这个DLL。当然要将需要用到的其他的文件和此DLL放在一起,因为C++的程序也用到了很多其他的文件。
然后就在C#中写了一个类,将用到的函数都放里面。就是重复的用DLLImport。
但是运行程序时报错,说是无法找到函数入口,先是发现在C++程序里,没有在函数外写_declspec(dllexport),这是将一个函数声名为导出函数,就是说这个函数要被包含她的程序之外的程序调用。 遂加上。加上后依然报错,在网上看到说,函数在编译后名称会改变,用DEPENDS.exe看了下,果然是这样,原来需要在_declspec(dllexport)前加上extern "C",指示编译器用C语言方法给函数命名。再运行,发现可以了。DEPENDS工具一般存放于VS的安装时的存盘目录中,...\\...\ Microsoft Visual Studio \ Common7 \ Tools \ depends.exe,你可以用它看DLL中的函数,以及它用到的其他DLL文件,也许你的DLL不能用是因为缺少其他dll。
但是,有个函数的参数为指针,运行后出来的结果为乱码,原函数为
extern "C" _declspec(dllexport) int rfid_reader_readTag(int reader_id, char* databuffer, int offset, int count, int bankchoice);
一开始,我是将函数写为
public static extern int rfid_reader_readTag(int reader_id, string databuffer, int offset, int count, int bankchoice);
不行,在网上找到解决办法,贴出原文
调用非托管dll时,数据类型的差异是引起出错的重要原因,在本例中调

本文介绍了在C#程序中调用C++编译的DLL时遇到的函数找不到入口、函数名混淆及参数传递问题。通过添加_declspec(dllexport)和extern "C"来解决函数导出问题,使用ref byte类型解决字符串乱码问题,并提供了解决方案的详细步骤。
2万+

被折叠的 条评论
为什么被折叠?



