开始
知识点2个
1.使用C#来调用易语言写的DLL,调用其他IDE是类似的
2.通过代码解决第二次调用易语言DLL闪退的问题
易语言源码(DLL,源码中使用了精益模块5.3 自行去论坛下载即可):
.版本 2
.程序集 程序集1
.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码
_临时子程序 () ' 在初始化代码执行完毕后调用测试代码
返回 (0) ' 返回值被忽略。
.子程序 _临时子程序
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
.子程序 C_Effectiveness, 文本型, 公开, 加密
.参数 text, 文本型, , 待加密的文本
.参数 passwords, 文本型, , 加密的密码
返回 (文本_加密 (text, passwords))
.子程序 C_decrypt, 文本型, 公开, 解密
.参数 text, 文本型, , 待解密的文本
.参数 passwords, 文本型, , 加密的密码
返回 (文本_解密 (text, passwords))
C#类库源码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace ConsoleApp1
{
class Program
{
[DllImport("cyuyan.dll")]
public static extern IntPtr C_Effectiveness(string text, string passwords); //加密 返回值使用IntPtr 而非string
[DllImport("cyuyan.dll")]
public static extern IntPtr C_decrypt(string text, string passwords); //解密 返回值使用IntPtr 而非string
static void Main(string[] args)
{
var passwords = "asdfa321fsd32f13d2as1f35sd1543a1sdf"; //加密用的密码
var username = "123456789"; //待加密的文本
var password = "abcdefg00"; //待加密的文本
Console.WriteLine("账号:"+ username);
Console.WriteLine("密码:"+ password);
var musername = C_Effectiveness(username, passwords); //将加密的账号存入变量
var mpassword = C_Effectiveness(password, passwords); //将加密的密码存入变量
Console.WriteLine("账号加密效果:" + Marshal.PtrToStringAnsi(musername));
Console.WriteLine("密码加密效果:" + Marshal.PtrToStringAnsi(mpassword));
Console.WriteLine("账号解密效果:" + Marshal.PtrToStringAnsi(C_decrypt(Marshal.PtrToStringAnsi(musername), passwords)));
Console.WriteLine("密码解密效果:" + Marshal.PtrToStringAnsi(C_decrypt(Marshal.PtrToStringAnsi(mpassword), passwords)));
Console.WriteLine("按任意键继续...");
Console.ReadKey();
}
}
}
效果:
源码截图(易语言):
源码截图(C#):
注意事项:
using System.Runtime.InteropServices; //加载using
[DllImport("cyuyan.dll")]//加载dll文件
public static extern IntPtr C_Effectiveness(string text, string passwords);//设置公开函数 ,注意 函数中的输入的参数必须为dll中的接受参数名保持一致,否则会报错
[DllImport("cyuyan.dll")]//加载dll文件
public static extern IntPtr C_decrypt(string text, string passwords);//设置公开函数 ,注意 函数中的输入的参数必须为dll中的接受参数名保持一致,否则会报错
返回的的值不要存入文本之类的,需要使用“IntPtr”指针,不然第二次调用dll函数的时候会导致程序异常退出
使用函数 “ Marshal.PtrToStringAnsi(IntPtr值) ” 可获得当前返回的文本
结束