• c#的Marshal


    补充过程中~
    感觉应该是C#调用非托管的比较专门的class
    
    例1、
    public struct ImageDataMsg 
    { 
    public char DataType; 
    public int Srv_index; 
    public char ConvertType; 
    //这个个地方要指定长度,这样就可以的德奥结构体的正确长度了 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] 
    public int[] VecLayer;//需要那几个图层。 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] 
    public int[] GridLayer;//需要那几个栅格图层 
    public int Scale_index;//需要的是那个比例尺的图像 
    public int x_pos; 
    public int y_pos; 
    public int ClientArea_x; 
    public int ClientArea_y; 
    } 
    //使用这个方法将你的结构体转化为bytes数组 
    public static byte[] Struct2Bytes(ImageDataMsg obj) 
    { 
    int size = Marshal.SizeOf(obj); 
    byte[] bytes = new byte[size]; 
    try 
    { 
    IntPtr ptr = Marshal.AllocHGlobal(size); 
    Marshal.StructureToPtr(obj, ptr, false); 
    Marshal.Copy(ptr, bytes, 0, size); 
    Marshal.FreeHGlobal(ptr); 
    return bytes; 
    } 
    catch (Exception ee) 
    { 
    MessageBox.Show(ee.Message); 
    return bytes; 
    } 
    } 
    
    //使用这个方法将byte数组转化为结构体 
    public static object BytesToStuct2(byte[] bytes, ImageDataMsg type) 
    { 
    //得到结构体的大小 
    int size = Marshal.SizeOf(type); 
    //byte数组长度小于结构体的大小 
    if (size > bytes.Length) 
    { 
    //返回空 
    return null; 
    } 
    //分配结构体大小的内存空间 
    IntPtr structPtr = Marshal.AllocHGlobal(size); 
    //将byte数组拷到分配好的内存空间 
    Marshal.Copy(bytes, 0, structPtr, size); 
    //将内存空间转换为目标结构体 
    object obj = Marshal.PtrToStructure(structPtr, typeof(ImageDataMsg)); 
    //释放内存空间 
    Marshal.FreeHGlobal(structPtr); 
    //返回结构体 
    return obj; 
    } 
    

      

  • 相关阅读:
    codeforces 764 C. Timofey and a tree(dfs+思维)
    codeforces 161 D. Distance in Tree(树形dp)
    codeforces 761 D. Dasha and Very Difficult Problem(二分+贪心)
    codeforces 761 C. Dasha and Password(多维dp)
    codeforces 264 B. Good Sequences(dp+数学的一点思想)
    HTML5 总结-画布-4
    HTML5 总结-拖放-3
    HTML5 总结-音频-2
    HTML5 总结-视频-1
    CSS3 总结-2
  • 原文地址:https://www.cnblogs.com/cfas/p/3139083.html
Copyright © 2020-2023  润新知