c#调用非托管dll里的函数,函数的参数时结构体,如何正确封送结构体...

发布网友

我来回答

1个回答

热心网友

C# 结构体可以这样定义
/// <summary>
/// 卷头记录 Reel Trailer Record卷尾格式也一样 共128字节
/// <summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] // [StructLayout(LayoutKind.Sequential, Pack = 1)] //顺序排列,并按1字节对齐
public struct ReelHeaderRecord
{
/// <summary>
/// 0000-0001 逻辑记录头
/// </summary>
[MarshalAs(UnmanagedType.U2, SizeConst = 2)]
public ushort LogicalRecordHeader;

/// <summary>
/// 0002-0007 服务名称6个字节
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst =6)]
public byte[] ServiceName;

/// <summary>
/// 0008-00013 空白1 默认值为0x20
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Blank1;

/// <summary>
/// 00014-00021 日期 ASCII码表示
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst =8)]
public byte[] Data;

/// <summary>
/// 00022-00023 空白2 默认值为0x20
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Blank2;

/// <summary>
/// 00024-00027 数据来源
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] OriginofDate ;

/// <summary>
/// 00028-00029 空白3 默认值为0x20
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Blank3;

/// <summary>
/// 00030-00037 卷名字
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] ReelName ;

/// <summary>
/// 00038-00039 空白4 默认值为0x20
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Blank4;

/// <summary>
/// 00040-00041 卷间逻辑序号
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] ReelContinuationNumber ;

/// <summary>
/// 00042-00043 空白5 默认值为0x20
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Blank5;

/// <summary>
/// 00044-00051 前邻卷名
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] PreviousReelName ;

/// <summary>
/// 00052-00053 空白6 默认值为0x20
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Blank6;

/// <summary>
/// 00054-00127注释
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 74)]
public byte[] Note;

}
网上有C#结构体转数组 数组转结构体的代码 字节数不少下来就可以用了

导入c++ DLL 可以像这样 DLL放到你运行程序的目录

[DllImport("你的DLL名称.dll")]
static extern void WriteData();
[DllImport("lisLib.dll")]
static extern void CloseData();

如果平台不对导入 要在 [DllImport 后面加一些语句就好,现在忘记了 以前用过

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com