【问题标题】:How to create a value typed Struct with strings?如何使用字符串创建值类型的结构?
【发布时间】:2022-01-12 09:48:53
【问题描述】:

我想读取一个带有结构的 MemoryMappedFile。字符串位于此文件中。所以我创建了一个这样的结构:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MemMappedFile
{
    
    [...]
    
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
    public string SomeString;

    [...]
}

我得到了错误

System.ArgumentException: The specified Type must be a struct containing no references.

据我了解,字符串是一种引用类型,但封送处理应该管理它,但它没有 - 可能我用错了。

如何在结构中使用字符串,它只需要超出值类型?

【问题讨论】:

  • 你是如何使用结构体的?
  • 从我在 SO 上的相关问题中读到的内容来看,规范的解决方案似乎是使用适当大小的 byte[] 并使用 Encoding.GetBytes/GetString 编码/解码您的字符串。
  • 用字节数组表示字符串。
  • 我想我需要为此使用不安全的上下文?
  • @SohaibJundi 该结构用于读取带有 MemoryMappedViewAccessor 的 MemoryMappedFile。因此它需要知道结构体的正确大小并引发错误。

标签: c# string struct value-type reference-type


【解决方案1】:

字符串本身不存储在结构中。相反,对字符串的引用存储在结构中,因此结构大小永远不会改变。

string 不是值类型; .NET 字符串是 interned,这意味着每个唯一的字符串都存储在内存中的查找表中。

【讨论】:

  • 我知道,这就是我在代码下的问题中写的。我将 MarshalAs 属性理解为它的一种解决方法,因为问题不在于引用,而在于事实是,当它在其中使用引用类型时,无法获取结构的大小。
【解决方案2】:

@Heinzi 的回答是正确的。

我不得不使用 byte[] 并使用不安全的上下文。

【讨论】:

  • 您不必写出哪个答案有帮助。而是将正确答案投票并将答案标记为正确。我知道不可能将答案标记为正确,因为在这种情况下答案只是一个评论。我建议请原作者将他的分析器写成答案,您可以标记为正确。
  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多