上一篇文章《如何用C#调用RUST的DLL》介绍了如何在c#中调用rust的dll,但是那篇文章只演示了传递基本类型,和使用c#传入数组到dll接口。如果我们需要从dll中读取数组或字符串数据,应该如何操作呢?本篇文章就将描述具体的实现方法
dll端的接口
这里我们用c来当作类比,另外,这里的代码将忽略引用的包(include
与use
)
可以看到,我们如果想给c#提供接口,首先需要双方已知的一个数组长度(字符串则要保证以\0
结尾),并在对用后,使用dll接口提供的free接口释放掉这个malloc出来的空间
下面是功能一致的rust代码,具体解释请参考代码中的注释
可以看到,和c的逻辑大体相同,理论上可以返回任意字节数组
C#端的使用
因为有一个需要free的操作,所以在C#中需要务必确保获取后释放。当然,手写这个流程十分容易出bug,好在.net
库中提供了一个自动处理的类,叫做SafeHandle
我们先将每个接口引用到c#中,这里我们新建一个类,起名为TestDLL
这里的BytesHandle
类就是我们接下来需要声明的类,它将接管我们返回的指针,并在变量被释放时自动调用dll中的free接口,具体代码如下:
可以看到,返回的接口中的handle
就是我们获取到的指针,通过自己编写的AsString
与AsBytes
接口来获取到我们需要的数据,并且在对象被释放时,会自动调用ReleaseHandle
以释放dll返回出来的指针。这样省时省力,可以像下面这样来方便地调用
输出如下:
输出结果符合预期
更多用法
可以使用Marshal
里的方法来获取其他类型的数组数据,甚至是结构体指针中的数据,这一点就不再赘述,留给大家自行探索了。
晨旭鸽鸽好帅