【问题标题】:What is the correct C# interop code to handle this structure and method?处理此结构和方法的正确 C# 互操作代码是什么?
【发布时间】:2009-12-04 22:20:25
【问题描述】:

我正在围绕非托管 DLL 编写托管包装器,但无法正确编组以下方法和结构。以下是非托管代码的 .h 文件中的内容:

typedef struct {
 WORD PI_code;
 DWORD grpStat[31]; 
 BYTE PTY_code;
 char* PS;
 char* RT;
} RdsData_t;

COMPANYNAME_API void COMPANY_get_rds_data(RdsData_t* rds_data);

在 PInvoke Interop Assistant 的帮助下,这就是我的想法:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RdsData_t
{

    /// WORD->unsigned short
    public ushort PI_code;

    /// DWORD[31]
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 31, ArraySubType = UnmanagedType.U4)]
    public uint[] grpStat;

    /// BYTE->unsigned char
    public byte PTY_code;

    /// char*
    [MarshalAsAttribute(UnmanagedType.LPStr)]
    public string PS;

    /// char*
    [MarshalAsAttribute(UnmanagedType.LPStr)]
    public string RT;
}        
[DllImport("companyname.dll", EntryPoint = "?COMPANYNAME_get_rds_data@@YAXPAURdsData_t@@@Z")]
    private static extern void COMPANYNAME_get_rds_data(ref RdsData_t data);

但是,按原样调用时会引发 AccessViolationException。通过搜索和实验,我能够想出一些不会抛出异常的东西,但是数据不正确或丢失,让我相信那些也不正确。

我应该为上述结构使用什么互操作代码?除了 PInvoke 助手之外,还有什么工具可以帮助我吗?

提前致谢!

【问题讨论】:

  • 如果您还没有去过那里,请查看pinvoke.net

标签: c# .net pinvoke


【解决方案1】:

试试下面的

    [StructLayoutAttribute(LayoutKind.Sequential)]
    public unsafe struct RdsData_t
    {

        /// WORD->unsigned short
        public ushort PI_code;

        /// DWORD[31]
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 31, ArraySubType = UnmanagedType.U4)]
        public fixed uint grpStat[31];

        /// BYTE->unsigned char
        public byte PTY_code;

        /// char*
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string PS;

        /// char*
        [MarshalAsAttribute(UnmanagedType.LPStr)]
        public string RT;
    }

注意:但是,您需要允许您的库/应用程序执行不安全的代码才能使其正常工作。

【讨论】:

  • 仍在使用它,但按原样,我收到错误“TypeLoadException:无法编组'GSS.UsbRadio.RdsData_t'类型的字段'grpStat':托管/非托管类型组合无效(此值类型必须与 Struct 配对)。”
  • 有趣......我明天再看看......这次运行以及编译......(我只是上次根据另一个 SO 问题编译它不同的结构类型...看来我误解了一些东西...)
猜你喜欢
  • 1970-01-01
  • 2018-03-10
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多