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怎样转换数据了。

原文地址:https://www.cnblogs.com/jayhust/p/3475219.html