8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

我应该怎么做才能将 C 联合结构转换为 C# 结构,让它们在内存中具有相同的类型

Herczeg Kristof 1月前

21 0

这是我在 C 中的结构:typedef struct s1 { int i; union { s2 u1; s3 u2; }typedef struct s2{ int w[10]; }typedef struct s3{ int w[10];}这是我的...

这是我在 C 中的结构:

typedef struct s1 {
    int i;
    union {
        s2 u1;
        s3 u2;
    }
}

typedef struct s2
{
    int w[10];    
}

typedef struct s3
{
    int w[10];
}

这是我在 C# 中的代码:

public struct s2
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    int[] w;
}

public struct s3
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    int[] w;
}

[StructLayout(LayoutKind.Explicit)]
public struct s4
{
    [FieldOffset(0)]
    int i;
    [FieldOffset(4)]
    s2 s2;
    [FieldOffset(4)]
    s3 s3;
}

当我使用该结构时,它会引发一个错误,关于[偏移量 4 处的对象字段与非对象字段错误地对齐或重叠]。

我使用一个字节来保存这个地方,然后获取字节指针来转换 s2 或 s3 结构;像这样 [ byte s3;]; 但使用起来很糟糕。

还有其他方法可以直接指定此类型吗?

我不知道,我试图添加属性 UnmanagedType.IUnknown 和其他一些属性,但仍然不起作用。

帖子版权声明 1、本帖标题:我应该怎么做才能将 C 联合结构转换为 C# 结构,让它们在内存中具有相同的类型
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Herczeg Kristof在本站《c#》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 小心使用 C int。它们并不总是 32 位,但 C# int 是。无论何时进行互操作,明确标量的大小都是明智的。

  • @JonasH Olivier 是正确的,如果可能的话(这需要特定的运行时支持),内联数组是

  • @JonasH 我曾经使用带有不安全标记的固定大小缓冲区;例如 ``` public fixed byte bt[10]; ``` ,但是当调用外部方法时,它会抛出关于编组数据的错误,我不知道编组数据会发生什么;

  • 您不能在这里使用数组(引用类型);但是, 内联数组 (类似于“固定缓冲区”)可以很好地工作:

    using System;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    
    Console.WriteLine(Unsafe.SizeOf<s4>());
    // ^^^ 44 = 11 integers, as expected
    
    var obj = new s4();
    obj.s2[3] = 13;
    Console.WriteLine(obj.s3[3]); // 13
    
    [InlineArray(10)]
    public struct s2
    {
        // this just defines the type for the inline array
        private int w;
    }
    [InlineArray(10)]
    public struct s3
    {
        // this just defines the type for the inline array
        private int w;
    }
    [StructLayout(LayoutKind.Explicit)]
    public struct s4
    {
        [FieldOffset(0)]
        int i;
        // changed accessibility to test
        [FieldOffset(4)]
        public s2 s2;
        [FieldOffset(4)]
        public s3 s3;
    }
    

    但是:说实话,考虑到 s2 s2 具有相同的形状...我真的不确定将它们作为单独的类型有什么意义只有单一类型和单一字段似乎没问题。


    如果您没有使用 .NET 8 或更高版本;固定缓冲区:

    public unsafe struct s2
    {
        private fixed int w[10];
        public int this[int index]
        {
            get
            {
                fixed (int* ptr = w)
                {
                    return new ReadOnlySpan<int>(ptr, 10)[index];
                }
            }
            set
            {
                fixed (int* ptr = w)
                {
                    new Span<int>(ptr, 10)[index] = value;
                }
            }
        }
    }
    public unsafe struct s3
    {
        private fixed int w[10];
        public int this[int index]
        {
            get
            {
                fixed (int* ptr = w)
                {
                    return new ReadOnlySpan<int>(ptr, 10)[index];
                }
            }
            set
            {
                fixed (int* ptr = w)
                {
                    new Span<int>(ptr, 10)[index] = value;
                }
            }
        }
    }
    
  • 这段代码只是假的,实际上,在我的项目中,有一个结构体,里面有一个 uion 结构体,而 uion 结构体又包含其他包含 uion 和数组的结构体。这是一个相对较大的结构体

返回
作者最近主题: