精易论坛

标题: [热心网友]易语言调用C#DLL 非COM (进阶教程) [打印本页]

作者: 初夏喔    时间: 2024-3-18 02:15
标题: [热心网友]易语言调用C#DLL 非COM (进阶教程)
本帖最后由 初夏喔 于 2024-3-18 02:16 编辑

进阶教程


目录



在阅读本篇教程前,请确保你已经掌握了入门篇




开始


String


C#函数


        [DllExport(CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static IntPtr StringFunc(IntPtr str)
        {
            var newStr = Marshal.PtrToStringAnsi(str);
            return Marshal.StringToHGlobalAnsi($"C#:{newStr}");
        }

DLL命令


.版本 2

.DLL命令 StringFunc, 文本型, "Test"
    .参数 str, 文本型

调用代码


调试输出 (StringFunc (“易语言”))

输出结果



C#:易语言



示例中演示了如何接收来自易语言的字符串,并且添加新内容返回给易语言




Byte[]


C#函数


        [DllImport("kernel32.dll", EntryPoint = "lstrlenA", CharSet = CharSet.Ansi)]
        public extern static int LstrlenA(IntPtr ptr);

        [DllExport(CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static IntPtr ByteFunc(IntPtr bytes)
        {
            var len = LstrlenA(bytes);
            byte[] buffer = new byte[zxsq-anti-bbcode-len];
            Marshal.Copy(bytes, buffer, 0, len);
            return Marshal.StringToHGlobalAnsi(string.Join(",", buffer));
        }

DLL命令


.版本 2

.DLL命令 ByteFunc, 文本型, "Test"
    .参数 bytes, 字节集

调用代码


.版本 2
.支持库 spec

调试输出 (ByteFunc ({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }))

输出结果



1,2,3,4,5,6,7,8,9,10



示例中演示了如何接收来自易语言的字节集,并且将其格式化成字符串返回给易语言




回调


C#函数


        [DllExport(CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static int CallBackFunc(IntPtr func)
        {
            Marshal.PtrToStringAnsi(func);
            var callback = (callback)Marshal.GetDelegateForFunctionPointer(func, typeof(callback));
            return callback(4);
        }

        public delegate int callback(int v);

DLL命令


.版本 2

.DLL命令 CallBackFunc, 整数型, "Test", "d"
    .参数 func, 子程序指针

易语言传递的子程序


.版本 2

.子程序 test, 整数型
.参数 v, 整数型

返回 (v × 2)

调用代码


调试输出 (CallBackFunc (&test))

输出结果



8



示例中演示了如何调用易语言传递过来的子程序,并调用它返回结果给易语言




结语


应该挺简单的,大家看不懂就照抄就完事了。


失业几个月了,有C#相关的活欢迎骚扰,有问题要付费咨询也可以。


如果本篇教程对你有帮助欢迎打赏 精币 或者 交易币 ,白嫖也没问题,大家都是从白嫖走过来的~



[groupid=227]热心网友[/groupid]
作者: 钥匙放在那    时间: 2024-3-18 09:28

作者: Siempre    时间: 2024-3-18 18:48
ding~
作者: guqisheng    时间: 2024-3-19 20:54

作者: guowei0422    时间: 2024-3-21 21:49
很强大 调用的c#dll 有没有办法不显示那个黑色的命令窗口?
作者: 初夏喔    时间: 2024-3-21 22:38
guowei0422 发表于 2024-3-21 21:49
很强大 调用的c#dll 有没有办法不显示那个黑色的命令窗口?

那是易语言的窗口吧和C#有啥关系
作者: guowei0422    时间: 2024-3-22 01:30
初夏喔 发表于 2024-3-21 22:38
那是易语言的窗口吧和C#有啥关系

大意了哈,搞错了程序类型。感谢指点
作者: qq977352880    时间: 2024-4-10 12:36
这是我今天学到的最有用的东西。

作者: a123456a123456    时间: 2024-4-15 20:36
感谢分享,很给力!~
作者: 五花小鱼    时间: 2024-6-30 14:31

请问大佬,这个Clear怎么调用
作者: cs潇潇    时间: 2024-8-18 02:09
最高只支持.net4.8,有没有方法支持6的
作者: zjbdsg    时间: 2024-9-27 02:01
有没有办法不落地啊,我发现很多内存加载的模块,都没办法加载c#的dll
作者: wyd168    时间: 2025-1-9 15:10
这个能调用C#下的其他库吗,比如BouncyCastle.Crypto.dll这个库





欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4