在C#WinForm中调用julia函数及在C#中传递参数到julia函数的使用示例

news2024/11/24 4:56:52

特别声明:未经允许,请勿转载! 

https://discourse.juliacn.com/t/topic/7189https://discourse.juliacn.com/t/topic/7189我在julia中国社区已提交了文章的最后部分未解决问题,大家后续可以在该链接中跟踪问题的回答进度。

好几年前就接触过julia,当时觉得并不好用,

如今julia版本已经来到了1.8.5版本,但是仍觉得它的生态还是不够好,很多问题都找不到答案。

我记录下当前的使用情况,在C#调用julia这块,结合前人的使用示例,我认为我这篇文章应该属于C#操作julia是最全的了。

在C#调用julia方面,目前已实现了如何使用以下函数(还有很多API接口函数可以在julia.h和jlapi.c中找到,但是要全部都会使用又是另一回事了):

jl_call1
jl_call2
jl_call3
jl_init__threading
jl_eval_string
jl_unbox_float64
jl_box_float64
jl_atexit_hook

此前搜索到前辈们留下的一个问题,

http://cn.voidcc.com/question/p-dhvlazdi-ux.htmlhttp://cn.voidcc.com/question/p-dhvlazdi-ux.html该链接是前人未结案的文章,至少我是这么认为。

我发现他的第1个和第2个结果是错误的,我把

public static extern IntPtr jl_box_float64(float value);

改为(float => double)

public static extern IntPtr jl_box_float64(double value);

得到的结果就正常了。

但是以下遇到的问题仍未解决.
julia脚本如下:

module JuliaClass
    export calculate

    function calculate(a::Float64, b::Float64)::Float64
        return a * pi + b^2
    end

    function calcMore(a, b)
        return ones(a, b)::Array{Float64,2};
    end

    function calc3par(a, b, c)
        return (a + b + c)::Float64;
    end

    function calcArray(a::Array{Float64,1})
        return (a[0] + a[1] + a[2])::Float64;
    end
end


C#脚本如下:


     //====================================================================
        [DllImport("kernel32.dll")]
        static extern bool SetDllDirectory(string lpPathName);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern void jl_init__threading(string path);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr jl_eval_string(string input);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr jl_box_float64(double value);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern double jl_unbox_float64(IntPtr value);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr jl_get_global(IntPtr func, string name);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr jl_call(IntPtr func, IntPtr[] v1, int v2);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr jl_call1(IntPtr func, IntPtr v1);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr jl_call2(IntPtr func, IntPtr v1, IntPtr v2);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr jl_call3(IntPtr func, IntPtr v1, IntPtr v2, IntPtr v3);

        [DllImport("libjulia.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern void jl_atexit_hook(int a);
        //====================================================================
        
        private void button_CsCallJulia_Click(object sender, EventArgs e)
        {
            ///加载julia环境路径
            string julia_home_dir = Application.StartupPath + "\\Julia-1.8.5\\bin";//我的WinForm是32位的,所以安装的是32位的julia
            SetDllDirectory(julia_home_dir);
            jl_init__threading(julia_home_dir);
            ///加载julia脚本路径
            string jl_ScriptPath = "./JuliaScript/test_julia.jl";
            string jl_include = "include(\"" + jl_ScriptPath + "\")";
            ///等效于julia>include("./JuliaScript/test_julia.jl")
            IntPtr jl_DoString = jl_eval_string(jl_include);
            ///执行julia脚本中JuliaClass模块的calculate函数
            IntPtr jl_ret = jl_eval_string("JuliaClass.calculate(2.0,4.0)");///julia函数返回值给C#中的IntPtr类型
            double cs_val = jl_unbox_float64(jl_ret);///julia拆箱转换为C#的double数据类型
            Console.WriteLine("result1={0}", cs_val);
            ///C#传递参数给julia
            IntPtr jl_function = jl_eval_string("JuliaClass.calculate");
            IntPtr jl_par1 = jl_box_float64(3.0);///C#参数1装箱
            IntPtr jl_par2 = jl_box_float64(4.0);///C#参数2装箱
            jl_ret = jl_call2(jl_function, jl_par1, jl_par2);///传入到julia指定模块中的函数,以及参数,注:jl_call2只能传递1个函数和2个参数
            cs_val = jl_unbox_float64(jl_ret);///julia拆箱转换为C#的double数据类型
            Console.WriteLine("result2={0}", cs_val);

            jl_function = jl_eval_string("JuliaClass.calc3par");
            jl_par1 = jl_box_float64(12.0);
            jl_par2 = jl_box_float64(13.0);
            IntPtr jl_par3 = jl_box_float64(14.0);
            jl_ret = jl_call3(jl_function, jl_par1, jl_par2, jl_par3);
            cs_val = jl_unbox_float64(jl_ret);
            Console.WriteLine("result3={0}", cs_val);

        }


问题就是:
1.我不知道如何在C#里通过jl_call传递一个数组到julia中的calcArray函数,
我尝试->

            jl_function = jl_eval_string("JuliaClass.calcMore");
            IntPtr[] jl_par = new IntPtr[3] { (IntPtr)11, (IntPtr)12, (IntPtr)13 };
            jl_ret = jl_call(jl_function, jl_par, 3);
            Console.WriteLine("result4={0}", jl_ret);


运行这段代码它报错如下:

result1=22.2831853071796
result2=25.4247779607694
result3=39

引发的异常:“System.AccessViolationException”(位于 RobotTestingAPP.exe 中)
“System.AccessViolationException”类型的未经处理的异常在 RobotTestingAPP.exe 中发生 
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

因此我不知道在C#中如何正确使用jl_call,搜索全网找不到答案!
2.如何在C#中使用jl_base_module等函数,如果是用C++调用,则是很方便,但我对C++并不了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Neck网络 FPN + PAN 改进解读

呃 这篇文章的目的在于补充一些知识以便于理解Neck部分的网络 特征提取网络 与 目标检测之间的关系 一个特征提取网络,假设有1000层,开始的特征图包含的细节信息就很多,而随着网络的加深,特征提取网络经过多次被卷积和池化操作&…

让你的SQL变得更简洁:学会ChatGPT活用技巧,轻松实现SQL格式化

文章目录 前言让你的SQL变得更简洁!学会ChatGPT活用技巧,轻松实现SQL格式化ChatGPT格式化SQL效果讯飞星火认知大模型格式化SQL效果文心一言格式化SQL效果格式化SQL效果结果比较 总结 【免责声明】文章仅供学习交流,观点代表个人,与…

Vue--》如何在Vue3中书写TSX

在vue2的时候就已经可以使用 jsx 语法,但是不是很友好,写起来是一件很痛苦的事情,所以你很少见到有人会在vue2中书写 jsx 语法,官方也不建议我们在vue2中进行书写 jsx 的代码风格: 但随着vue3版本的到来,对…

SBUS协议解析图解

SBUS协议在硬件上是串口反相协议。 在软件上就是普通串口协议,波特率100k,8位数据位,2位停止位,偶校验even。注意,stm32把校验位也当做数据,所以数据位要设置成9,而不是8。 其报文格式为&…

scala---spark本地调式远程获取hdfs数据注意事项

文章目录 前言一、Hadoop配置注意事项1.1 core-site.xml1.2 core-site.xml 二、本地hadoop环境配置注意事项三、本地scala项目spark代码调试总结 前言 这篇文章主要帮大家绕开一些本地使用spark调试获取远程hdfs数据的坑,个人在使用时也是基本把这些坑踩了一遍。希望…

永远不该忘记!科技才是硬道理,手中没有剑,跟有剑不用,是两回事

今天是全国防灾减灾日,距离2008年汶川大地震也已经过去15年了。但时至今日,看到那些图像视频资料,那种触及灵魂的疼痛仍是存在的,2008年的大地震在每个中国人身上都留下了无法抚平的伤疤。 2008年是所有中国人都无法忘记的一年&am…

设计模式——单一职责模式之装饰模式

文章目录 前言一、“单一职责” 模式二、Decorator 装饰模式1、动机2、模式定义3、伪代码示例①、第一种写法②、第二种写法③、第三种写法 4、结构 总结 前言 一、“单一职责” 模式 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是…

深度指南:WhatsApp广播vs WhatsApp群组(二)

如何为创建WhatsApp群组? 建立 WhatsApp 群组,请按下列步骤操作。 1. 导航到您的WhatsApp或WhatsApp for Business(布局或界面相同),然后点击“新建组”。 2.现在,您可以将参与者添加到您的WhatsApp群组…

华为OD机试真题 Java 实现【静态代码扫描服务】【2023Q1 100分】

一、题目描述 静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币;扫描报告的缓存成本和文件大小无关,每缓存一个报告…

算法修炼之练气篇——练气十层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

华为网络篇 静态路由与BFD联动-21

实验难度2实验复杂度2 目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 BFD(Bidirectional Forwarding Detection,双向转发检测)是一种实验网络可靠性的机制,它可用于快速检测网络中的链路状况…

常见自动化测试工具及框架有哪些?怎么选?

目录 一、自动化测试简介 1、什么是自动化测试 2、它可以做自动化测试么 二、工具篇 1、UFT(QTP) 2、Selenium 3、Appium 4、工具对比 三、框架篇 1、TestNG 2、unittest 3、pytest 4、Robot Framework 5、框架对比 四、如何选择 总结 一…

ES6知识点

目录 1、let、cons、var的区别 2、const对象的属性可以修改吗 3、如果new一个箭头函数会怎么样 4、箭头函数和普通函数的区别: 5、扩展运算符的作用及使用场景 1、let、cons、var的区别 1️⃣:块级作用域:块作用域由{}包括,le…

Flink 常用API(1)—— 源算子

目录 执行环境(Execution Environment) 创建执行环境 执行模式配置 触发程序执行 源算子(Source) 从集合中读取数据 从文件中读取数据 从Socket读取数据 从Kafka读取数据*** 自定义 Source(数据源&#xff0…

【结构与算法】—— 游戏概率常用算法整理 | 游戏中的常见概率设计分析

📢博客主页:肩匣与橘📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由肩匣与橘编写,首发于CSDN🙉📢生活依旧是美好而又温柔的,你也是✨ …

Smartbi X 广州轻工集团,打造集团价值创造型总部

广州轻工工贸集团有限公司(简称“广州轻工集团”)是广州市第一家工贸合一的大型企业集团公司,最早起源于1950年9月成立的广州市合作事业管理局,逐渐演化形成广州市轻工业局。1995年10月,广州市轻工业局成建制改建为经济…

【C++】搜索二叉树

文章目录 📕 概念📕 搜索二叉树的实现框架插入节点查找节点★ 删除节点 ★ 📕 源代码 📕 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空&…

5。STM32裸机开发(2)

嵌入式软件开发学习过程记录,本部分结合本人的学习经验撰写,系统描述各类基础例程的程序撰写逻辑。构建裸机开发的思维,为RTOS做铺垫(本部分基于库函数版实现),如有不足之处,敬请批评指正。 &a…

全景描绘云原生技术图谱,首个《云原生应用引擎技术发展白皮书》发布

5月12日,由神州数码主办、北京经开区国家信创园、中关村云计算产业联盟协办的2023通明湖论坛-云原生分论坛在京召开。论坛期间,神州数码联合北京通明湖信息技术应用创新中心、中国信通院和通明智云正式发布了《云原生应用引擎技术发展白皮书》&#xff0…

干货 | 心理学人电脑选购指南来了!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 当我们在选择电脑时经常会无从下手,不知道该如何才能选择一款既能满足我们的科研需要又具有良好性价比的电脑。 本期我们邀请到了唐仙和梦马来为我们详细解答心理学…