C#怎么调用C++的dll?

C++头文件原形:
/*
**函数:libIoCtrlInit
**函数说明:初始化驱动及导入SDK动态库
**参数:hlib 模块地址指针,bios_id 主板BIOS ID号,在主板BIOS setup中可以查看得
到、
**返回值: 0 成功,非0失败 ,成功时并导出HMODULE的实例
*/
extern "C" __declspec(dllexport) int libIoCtrlInit(HMODULE *hlib,char* bios_id);

/*
**函数:setPinLevel
**函数说明:设置管脚的输入输出状态
**参数:hlib 模块地址指针,index 管脚序号(参看GPIO_INDEX枚举定义),curstate 设
置管脚输入输出状态,0为低电平,1为高电平(仅为寄存器状态,实际电路的状态,取决于外
部电路)
**返回值: 0 成功,非0失败
*/
extern "C" __declspec(dllexport) int setPinLevel(HMODULE *hlib, GPIO_INDEX index,
GPIO_LEVEL curstate);

C#声明:

[DllImport("libIoCtrlx86.dll",CallingConvention = CallingConvention.Cdecl)]
public static extern int libIoCtrlInit( IntPtr hlib, string bios_id);

[DllImport("libIoCtrlx86.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int setPinLevel( IntPtr hlib, GPIO_INDEX index,GPIO_LEVEL curstate);

C#调用方法:
int a = 1; int b= 1;
string bios_id = "M56L6R"
IntPtr hlib= Marshal.AllocHGlobal(2000);
a=libIoCtrlInit( hlib, bios_id);
b=setPinLevel( hlib, GPIO_INDEX.GPIO_PIN1, GPIO_LEVEL.GPIO_HIGH_LEVEL);

大写字母的是枚举类型,不会出错,这样运行后,a=0,b=-1,根据SDK资料等于0是成功的,是哪里出错了?造成初始化是成功的,然而后面的操作都是失败的?并不知道模块有多大,但DLL文件只有10多K,申请内存的地址大小都改过,没有作用,ref 也用过,也是没有作用, 哪位大佬帮忙看看?我实属菜鸟,谢谢! 电路跟系统没有问题,随SDK有个小程序,用那个程序可以读写IO是正常的.

第1个回答  2019-08-05
首先,C#是可以调用C写的DLL的,引用时VS会自动将这个DLL转换为托管程序。 但是你这个DLL是去调用别的C库就会出问题,因为别的库依然是非托管的。追问

这个dll应该没有去调用别的C库的,我贴出来的总共两条语句,第一条应该是成功的,返回值是0,然后利用第一条初始化返回的是0,应该是成功了,后面的一条一句要利用第一条语句返回的句柄去写IO,然后就失败了,我不知道我这样引用句柄是对的还是错了

本回答被提问者采纳
相似回答