分享

LabVIEW调用c#的完美方案

 颢文苑 2022-09-22 发布于湖北

LabVIEW的功能很强,c#的功能也很强,但总有需要互相借鉴的地方。最初要混合编程是希望用lv做界面,借用VisiyonPro的强大图像处理功能。当时囿于知识限制,并没有很好的解决这个问题。后来有点懂的时候,就看不上lv制作的界面了(其实是没学好)。

LabVIEW和c#的主要分歧是在于数据传递和垃圾回收。LabVIEW的线上传递的数据,无论是对象还是一般数据类型,都会像快递一样发送过去,这叫传值。如果不用的数据需要显式销毁。c#中的数据分为两类:值类型和引用类型。对象是引用类型,传送对象时,传递的只是对象的内存地址,就像你银行卡里的工资,你并没有摸到。当对象不再被使用的时候,GC会将其销毁

Lv调用c#时,如果c#返回的是对象,那就灾难了。使用Lv的工程师通常都不太懂OOP,很容易发生忘记销毁的事情,从而发生内存泄露。最后的结果就是内存溢出,程序崩溃。

既然对象是lv和c#的关系很难调和的矛盾点,那混合编程时不使用对象应该就好了。那lv调用c#就演变为新的问题,怎么合理设计c#库和lv之间的数据接口

c#中的值类型数据(int,float,double等)都可以作为二者之间直接通信的候选。这可以作为单个数据的解决方案。

当数据比较复杂的情况下,返回值不是单个值,有很多个数据,数据类型也不相同,该如何解决呢?

string类型是一个很好的数据载体,它是引用类型,但在c#中可以像值类型一样使用。

在这里插入图片描述
可以将结果拼接成字符串,类似这样返回给lv程序。

return "x,1.0,y,2.0,z,0.0";

还有更神奇方便的方法,就是使用对象序列化。c#中使用对象,返回结果直接将对象序列化为字符串。

public class Root
{
    public string returnCode { get; set; }
    public string returnMsg { get; set; }
    public int lessTimes { get; set; }
    public string domainLink { get; set; }
    public int seqNum { get; set; }
    public int identification { get; set; }
    public bool isNeedImageCode { get; set; }
}

上面这个Root类包含7个数据,3中数据类型。返回结果为Root对象的情况下,可以使用序列化函数将其直接转化为字符串。

return new Root();
return JsonConvert.SerializeObject(new Root());

LabVIEW收到的数据会是这样一个字符串“{“returnCode”: “R0000”,“returnMsg”: “成功”,“lessTimes”: “2”,“domainLink”: “”,“seqNum”: “1”,“identification”: “595279”,“isNeedImageCode”: “false”}” 。

使用LabVIEW的字符串函数很容易解析其中的结果。

所以,LabVIEW调用.net的库的完美解决方案就是:1、使用string作为返回数据的类型;2、使用序列化函数将对象转化为字符串。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多