• VS2010导入DLL的总结


    1. 添加using System.Runtime.InteropServices;

    2. 在C++中的HANDLE被C#中的IntPtr代替

    3. 下一段代码中:

    [DllImport("XXX.dll", EntryPoint = "OpenPort")]
    public static extern int openPort(String name, String baudrate);

    EntryPoint = "OpenPort"指明在原DLL中函数的名称,openPort为重声明后的函数名称

    4. C++中的指针对应C#中的ref前缀,如:

    [DllImport("XXX.dll", EntryPoint = "Receive")]
    public static extern int receive(int device, ref OGeneralInfoOutputPackageType pGeneralInfoOutputPkg);

    5. 结构体的重声明:

    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct OGeneralInfoOutputType
    {
        public ushort SrcAddr;
        public ushort TargetAddr;
        public ushort Cmd;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public Byte[] uidArr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
        public Byte[] dataArr;
    };
    
    
    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct OGeneralInfoOutputPackageType { public ushort cmdSum; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public OGeneralInfoOutputType[] cmdArr; // 最多可以接收256个帧 };

     6. MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
    MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。当 MarshalAsAttribute.Value 设置为 ByValArray
    时,必须设置 SizeConst 以指示数组中的元素数。当需要区分字符串类型时,ArraySubType 字段可以选择包含数组
    元素的 UnmanagedType。此 UnmanagedType 只可用于作为结构中的字段的数组。而SizeConst则是指数组中的元素个
    数。这是一个历史问题,因为C#的数据和C++的数据布局方式有很大的不同,然而如果在P/Invoke和COM Interop当中,
    又必须要在C#和C++之间传递数据,有的时候,CLR或者说.NET能够自动在两种编程语言之间转换数据,有的时候又不行,
    这时候就需要程序员来帮忙告诉.NET怎样转换数据了。

  • 相关阅读:
    http://www.bugku.com:Bugku——SQL注入1(http://103.238.227.13:10087/)
    [笔记]一道C语言面试题:大整数乘法
    [笔记] Access Control Lists (ACL) 学习笔记汇总
    [笔记]如何将传统的回调函数转换为C#5.0支持的await格式
    6.链接与导航
    9章 下拉菜单
    11章圆角框 本章很重要 经常用到
    原来链接与导航
    7竖直排列的导航菜单
    8.水平导航菜单
  • 原文地址:https://www.cnblogs.com/jayhust/p/3475219.html
Copyright © 2020-2023  润新知