2009-12-06 1 views
0

Я работаю с пакетами, которые я могу получить или отправить как массив байтов, , который имеет фиксированную структуру. Так что я пытаюсь создать эффективный союз следующим образом:Союзы структур фиксированного размера для использования в безопасном контексте

using System; // etc.. 

namespace WindowsApplication1 
{ 
    public partial class Main : Form 
    { 
     public const int PktMaxSize = 124; 
     // ...etc.. 
     // ...will use Pkt structure below... 
    } 

    [System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] 
    public struct Pkt 
    { 
     [System.Runtime.InteropServices.FieldOffset(0)] 
     fixed Byte bytes[Main.PktMaxSize]; // complete byte pkt 

     [System.Runtime.InteropServices.FieldOffset(0)] 
     fixed Byte PktID[8]; 

     [System.Runtime.InteropServices.FieldOffset(8)] 
     UInt16 Properties; 

     // ...etc.. 
    } 
} 

Я получаю C# Ошибка

Указатели и буферы размера могут быть использованы только в небезопасном контексте

Что мне нужно сделать, чтобы создавать и использовать «небезопасные» структуры в безопасном режиме?

Благодарим за помощь. Откройте все предложения относительно того, как обращаться с структурами пакетов, которые могут быть легко преобразованы в и из потока фиксированного байта, получаемого (или отправленным) классом взаимодействия C++.

ответ

0

Используйте небезопасных ключевое слово на методе или блоке:

unsafe static void DoSomethingUnsafe() 
{ 
    // use Pkt structure 
} 

static void DoSomething() 
{ 
    // do safe things 
    unsafe 
    { 
    // use Pkt structure 
    } 
} 

Вы должны также включить небезопасный код через/небезопасный вариант или Проект> Свойства> вкладка Построить в Visual Studio.

3

Использование fixed ключевого слова требует Pkt и все методы, использующие его быть объявлены небезопасными, например,

[StructLayout(LayoutKind.Explicit)] 
public unsafe struct Pkt 
{ 
    [FieldOffset(0)] 
    fixed Byte bytes[124]; 

    ... 
} 

Если вы не хотите использовать небезопасный код, который вы можете объявить Pkt следующим образом:

[StructLayout(LayoutKind.Explicit)] 
public struct Pkt 
{ 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 124)] 
    [FieldOffset(0)] 
    Byte[] bytes; 

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    [FieldOffset(0)] 
    Byte[] PktID; 

    [FieldOffset(8)] 
    UInt16 Properties; 
} 
Смежные вопросы