2012-10-15 7 views
3

MemoryMappedViewAccessor 클래스에서 Write<T> 함수를 사용하려고합니다.지정된 형식이 참조가없는 구조체 여야합니다.

[StructLayout(LayoutKind.Explicit)] 
    public struct Message 
    { 
     public void AddString(string str) 
     { 
      if (stringContents == null) 
       stringContents = new byte[1024 * 10]; 
      stringContents = Encoding.ASCII.GetBytes(str); 
     } 
     public string GetString() 
     { 
      if (stringContents == null) 
       return string.Empty; 
      return Encoding.ASCII.GetString(stringContents); 
     } 
     [FieldOffset(0)] 
     public byte[] stringContents; 
    } 

을 그러나, 나는이 같은 전화를 걸 때 :

지정된 유형 :

//Initialized Elsewhere: MemoryMappedViewAccessor writer 
Message messageAlreadyOnWire = new Message(); 
messageAlreadyOnWire.AddString(data); 
writer.Write<Message>(0, ref messageAlreadyOnWire); 

다음과 같이 나는 오류가 발생 다음과 같이 내 T이 경우는 참조를 포함하지 않는 구조체 여야합니다. 매개 변수 이름 : 유형

내 구조체의 유일한 '참조'는 바이트 배열입니다. 이 문제를 해결할 방법이 있습니까? 고정 길이 바이트 배열은 괜찮지 만,하지 말고 unsafe의 땅을 탐색하지 않고 선언하는 방법을 잘 모르겠습니다.

답변

0

[MarshalAs(UnmanagedType.ByValArray, SizeConst = Your_Size)]부터 Message.stringContents까지 적용 해보십시오.

+0

제안 된 속성이 코드에 추가되었습니다. 여전히 정확한 오류를 생성합니다. – GWLlosa

0

이 문제를 해결할 수있는 방법으로 MemoryMappedViewAccessor 대신 MemoryMappedViewStream을 사용할 수 있습니다. 그런 다음 접근 자 대신에 기존의 스트림 읽기/쓰기를 사용하십시오.