aardio 文档

aardio 范例: 原生结构体

//原生结构体
import dotNet; 
import console.int; 
console.open();

var compiler = dotNet.createCompiler("C#");

//指定 /unsafe 选项,否则操作原生结构体的代码会非常复杂
compiler.Parameters.CompilerOptions = "/optimize /unsafe" ;

compiler.Source = /******   
using System;
using System.Runtime.InteropServices;

namespace CSharpLibrary  
{   
    //使用跨语言兼容的结构体内存布局 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public unsafe struct MyCStruct //结构体前要加 unsafe 关键字
    {
        public int id;
        public float value; 
    }

    public class Util  
    {    
        //函数名前要加 unsafe 关键字
        public static unsafe void TestStruct(IntPtr bytePtr)
        {
            //创建结构体
            MyCStruct myStruct; 

            //将数据复制到结构体
            myStruct = *(MyCStruct*)bytePtr;

            System.Console.WriteLine("id:{0},value:{1}",myStruct.id,myStruct.value); 

            //修改结构体
            myStruct.id = 33;
            myStruct.value = 44;

            //将修改后的内容写回去
            *(MyCStruct*)bytePtr = myStruct; 
            //Marshal.StructureToPtr(myStruct,bytePtr,false);
        } 

    }   
} 
******/ 
compiler.import("CSharpLibrary");  

//声明结构体
class MyCStruct {
    int id = 22;
    float value = 33; 
}

//创建结构体
var myStruct = MyCStruct();

//分配固定内存
var fixedBuffer = raw.buffer(myStruct);

//直接取指针地址要谨慎,务必保持 fixedBuffer 在作用域内(避免回收内存)。
//获取指针并转为数值(.NET 不能传指针参数,可以先换为数值)
var intPtr = tonumber( raw.toPointer(fixedBuffer) );

//结构体指针地址作为参数
CSharpLibrary.Util.TestStruct( intPtr ); //C# 参数声明为 IntPtr 类型(本质上也是数值)

//自内存获取为结构体。
raw.convert(fixedBuffer,myStruct);

//查看 C# 修改后结构体数据
console.dumpJson(myStruct); 

Markdown 格式