【问题标题】:Cannot take the address of, get the size of, or declare a pointer to a managed type ('type name')无法获取托管类型的地址、大小或声明指向托管类型(“类型名称”)的指针
【发布时间】:2011-02-03 07:14:26
【问题描述】:

如果我的结构中有一个或多个 System.String,则此错误将停止编译
还有其他存储字符串的方法吗?

我尝试过这样的事情:

private long _B_ID;
private byte[] _C_Name;
private byte[] _C_Address;
private byte[] _C_Telephone;

但它似乎不起作用。

【问题讨论】:

  • 你在用结构做什么?需要更多信息……
  • @n535:这是第一个代码,我的问题中的代码是第二个。
  • @Konrad Rudolph:我从 UdpClient 获取它们,将它们复制到非托管内存并尝试将它们转换为真正的结构。
  • 你能说得更具体点吗?
  • @n535:我停止使用指针,我正在使用 System.Runtime.Formatters.Binary.BinaryFormatter。并以超快的速度玩得开心。

标签: .net pointers string struct


【解决方案1】:

只有当它是 blittable 时,你才能获取结构的地址,即它不包含引用。
Blittable and Non-Blittable Types(MSDN)

【讨论】:

    【解决方案2】:

    即使使用“不安全”,也不能声明指向非固定类型的指针。要消除此错误,您必须指定数组的大小以及关键字 fixed。

    例如,_C_Name 包含 25 个字节。所以声明为:

    private fixed byte _C_Name[25];
    

    字符串是固定类型的,因此当您将它们声明为字符串时不会出错。 希望它对你有用!

    问候!

    【讨论】:

    • 这是否可以使用泛型。我有一个泛型类MyClass<T> 应用了struct 类型约束和额外的运行时检查以将<T> 限制为原始整数和浮点类型。在不安全的方法中,我想将void* 转换为fixed T []。有没有办法绕过编译时限制?
    【解决方案3】:

    试试MarshalAs 属性:

    struct Foo
    {
        [MarshalAs(UnmanagedType.LPStr]
        string s;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多