C#调用C++动态库dll

1. C++ 编译成 dll

extern "C" _declspec(dllexport) bool Connect(char cSerial[100]);

bool Zfy_Connect_ALC(char cSerial[100])
{
	return false;
}

成功条件:能通过dll export viewer工具查看dll里面所有的函数


2.C#声dll中的所有函数

[DllImport("zfy_dll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern Boolean Connect(StringBuilder serial);

然后程序就可以使用这些接口了

 

之前用vs2012编译出来的dll在本机可以正常运行,但是把生成的release包放到其他电脑上直接报错找不到dll,但是项目以前就有的dll在其他电脑上是可以正常运行的。也就是问题出现在新的dll上。

打开两个cmd(或VS开发人员命令提示)分别输入dumpbin /headers new.dll dumpbin /headersold.dll看下区别,发现都是32 bit word machine,应该都是对应32位程序的dll,没什么问题,然后继续往下看,new.dll11.00 linker version是用vs2012编译出来的版本,old.dll6.00 linker version应该是用vc6.0编译出来的版本。

接着把c++代码用vc6.0重新编译一次生成dll(由于c++程序用到了其他的库,所以需要配置一下vc6.0,工程->设置->连接->对象/库模块里面添加lexample.lib,如果出现*.pch: No such file or directory,则应该取消编译预编译头,工程->设置->C/C++->分类->预编译的头文件->不使用预补偿页眉),问题就解决了。


3.使用upxdll进行压缩

upx可以理解成压缩软件,不过他只对可执行文件进行压缩(如EXE文件),当然也有人把他叫壳,即为软件各程序加个壳。通俗点说,就是UPX仅仅可以用来压缩可执行文件,而且压缩后的文件还可以无需解压缩直接运行的。


打开cmd进入upx目录执行命令upx.exe new.dll

这样生成的dll大小会减小许多。

版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(C++,C#,dll,库)