动态链接库怎么写( 二 )


我修改动态链接库实现 , 返回结果为串b: LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;} 修改 C# 导入定义 , 将串b修改为ref方式: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, ref string b); } 在C#中再调用测试: string strDest=""; string strTmp= RefComm.mySum("45", ref strDest); 运行查看结果 strTmp 和 strDest 均不对 , 含不可见字符 。再修改 C# 导入定义 , 将CharSet从Auto修改为Ansi: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, string b); } 在C#中再调用测试: string strDest=""; string strTmp= RefComm. mySum("45", ref strDest); 运行查看结果 strTmp 为"45" , 但是串 strDest 没有赋值 。
第二步实现函数返回串 , 但是在函数出口参数中没能进行输出 。再次修改 C# 导入定义 , 将串b修改为引用(ref): public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, ref string b); } 运行时调用失败 , 不能继续执行 。
第三步 , 修改动态链接库实现 , 将b修改为双重指针: LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;} C#导入定义: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern string mySum (string a, ref string b); } 在C#中调用测试: string strDest=""; string strTmp= RefComm. mySum("45", ref strDest); 运行查看结果 strTmp 和 strDest 均为"45" , 调用正确 。第三步实现了函数出口参数正确输出结果 。
第四步 , 修改动态链接库实现 , 实现整数参数的输出: LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;} C#导入的定义: public class RefComm { [DllImport("LibEncrypt.dll", EntryPoint=" mySum ", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)] public static extern int mySum (int a, int b,ref int c); } 在C#中调用测试: int c=0; int iSum= RefComm. mySum(,, ref c); 运行查看结果iSum 和c均为5 , 调用正确 。经过以上几个步骤的试验 , 基本掌握了如何定义动态库函数以及如何在 C# 定义导入 , 有此基础 , 很快我实现了变长加密函数在 C# 中的调用 , 至此目标实现 。
三、结论 在 C# 中调用 C++ 编写的动态链接库函数 , 如果需要出口参数输出 , 则需要使用指针 , 对于字符串 , 则需要使用双重指针 , 对于 C# 的导入定义 , 则需要使用引用(ref)定义 。对于函数返回值 , C# 导入定义和 C++ 动态库函数声明定义需要保持一致 , 否则会出现函数调用失败 。
定义导入时 , 一定注意 CharSet 和 CallingConvention 参数 , 否则导致调用失败或结果异常 。运行时 , 动态链接库放在 C# 程序的目录下即可 , 我这里是一个 C# 的动态链接库 , 两个动态链接库就在同一个目录下运行 。
6.什么是动态链接库DLL文件即动态链接库文件 , 是一种可执行文件 , 它允许程序共享执行特殊任务所必需的代码和其他资源 。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源 。
DLL多数情况下是带有DLL扩展名的文件 , 但也可能是EXE或其他扩展名 。它们向运行于Windows操作系统下的程序提供代码、数据或函数 。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序 。