Как манипулировать данными в упакованных структурах, используя прокси-класс? - PullRequest
0 голосов
/ 26 февраля 2010

У меня есть проект, в котором я использую System.Runtime.InteropServices для определения структуры следующим образом, так что она упакована в байтовые границы и готова к отправке на последовательный порт и оттуда во встроенную систему. (важные для бизнеса имена были удалены)

public class ControlCommandClass 
{
  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
  public struct ControlCommandData
  {
    public Uint32 Field1;
    public Uint16 Field2;
    public Sbyte  Field3;
    public Uint32 Field4;
  }; // this struct is 11 bytes in memory!

  private ControlCommandData rawdata;

  public UTCTime Field1;

  public ControlCommandClass()
  {
    this.Field1 = new UTCTime(ref this.rawdata.Field1);
  }
}

То, что я пытаюсь сделать, это использовать конструктор для присвоения ссылок на эти поля прокси-классу, используя

Field1 = new UTCTime(ref this.rawdata.Field1)

, чтобы обернуть необработанные данные в структуре в класс, который позволяет выполнять более сложные операции перед вычислением 32-разрядного целого числа, соответствующего времени. мой прокси класс

public class UTCTime : Field
{
  private Uint32 dataReference;

  public UTCTime(ref rawData)
  {
    // code to do reference assignment here?
  }
}

Есть ли способ использовать dataReference в качестве ссылки на Field1, чтобы мой прокси-класс мог манипулировать данными в упакованной структуре?

Спасибо заранее, Томас.

1 Ответ

1 голос
/ 26 февраля 2010

Это невозможно, как есть.

Общее правило состоит в том, что вы не можете хранить ссылку на управляемый объект.

Передача по ссылке позволяет использовать ссылку столько, сколько вы хотите. Но вам нужно переключиться на небезопасный блок с IntPtr , чтобы выполнить то, что вы пытаетесь сделать.

...