2009-10-28 5 views
1

일반 .NET 응용 프로그램이 있습니다. 이 경우 MEF가 수입하는 부분이 있습니다. 그것은 잘 가져옵니다,하지만 특정 시점에서, 나는 개체 목록을 파일에 저장하고 싶습니다.새 FileStream을 만들 때 System.Security.SecurityException

class HighScores 
{ 
    static HighScores() 
    { 
     CheckTrust(); 
    } 

    [ImportingConstructor] 
    public HighScores(
     [Import("/Services/LoggingService", typeof(ILoggingService))] 
     ILoggingService l 
     ) 
    { 
     logger = l; 

    } 

    private ILoggingService logger { get; set; } 

    public IEnumerable<HighScore> Scores 
    { 
     get 
     { 
      return m_Scores; 
     } 
    } 
    private List<HighScore> m_ScoresUnsorted = new List<HighScore>(); 
    private readonly ObservableCollection<HighScore> m_Scores = 
     new ObservableCollection<HighScore>(); 

    public void LogNewHighScore(string name, int score, int level) 
    { 
     m_ScoresUnsorted.Add(new HighScore(name, score, level)); 
     CreateObservable(); 

     if (IsFullTrust) 
     { 
      Stream stream = null; 
      try 
      { 
       // this line causes exception 
       stream = new FileStream("HighScores.dat", 
         System.IO.FileMode.Create, FileAccess.Write); 
       BinaryFormatter b = new BinaryFormatter(); 
       b.Serialize(stream, m_ScoresUnsorted); 
      } 
      catch (Exception e) 
      { 
       logger.Error("Error writing high scores:", e); 
      } 
      finally 
      { 
       if (stream != null) 
       { 
        stream.Close(); 
       } 
      } 
     } 
    } 

    private void CreateObservable() 
    { 
     m_ScoresUnsorted.Sort(); 
     m_Scores.Clear(); 
     for(int i = m_ScoresUnsorted.Count-1; i >= 0; i--) 
     { 
      m_Scores.Add(m_ScoresUnsorted[i]); 
     } 
    } 

    static private void CheckTrust() 
    { 
     try 
     { 
      FileIOPermission permission = 
       new FileIOPermission(PermissionState.Unrestricted); 
      s_FullTrust = SecurityManager.IsGranted(permission); 
     } 
     catch (Exception) 
     { 
      // ignore 
     } 
    } 

    static private bool s_FullTrust; 
    static public bool IsFullTrust 
    { 
     get 
     { 
      return s_FullTrust; 
     } 
    } 

} 

나는 새로운 파일 스트림 라인에 System.Security.SecurityException 받고 있어요 :이 경우는 높은 점수의 목록을 저장합니다. 기이 한 점은이 텍스트를 TextWriter로 바꾸면 작동한다는 것입니다. 나는 내가 뭘 잘못하고 있는지 이해하지 못한다.

편집 : 추가 정보 ...이 코드를 생성자에 넣으면 실행됩니다. 호출 스택을 뒤따라 가면 (위의 샘플에서 벗어날 때) GUI 스레드에서 실행중인 것처럼 보입니다. 특히 WPF 발송자는 PropertyChanged 이벤트가 발생했다는 사실을 기반으로 속성에 대해 get 작업을 실행하고 있습니다. 어쩌면 WPF에서 GUI I/O를 할 수없는 GUI 리프레셔와 관련이 있을까요? 이런 종류의 의미가 있습니다 ... 당신은 파일 쓰기와 같은 것을 위해 GUI를 잠그고 싶지 않을 것입니다 ...

답변

0

나는 스트림 기능을 가져 와서 " 이 같은 안전하지 않은 "스레드 풀 스레드 : 내가 정리해야 정말 나쁜 동기화 문제의 전체 무리가 있지만 작동 물론

 ThreadPool.UnsafeQueueUserWorkItem(ignoredState => 
     { 
      Stream stream = null; 
      try 
      { 
       stream = new FileStream("HighScores.dat", System.IO.FileMode.Create, FileAccess.Write); 
       BinaryFormatter b = new BinaryFormatter(); 
       b.Serialize(stream, "Test String"); 
      } 
      catch (Exception e) 
      { 
       logger.Error("Error writing high scores:", e); 
      } 
      finally 
      { 
       if (stream != null) 
       { 
        stream.Close(); 
       } 
      } 
     }, null); 

. 내가 할 일은 스레드 내부를 잠그고 목록의 복사본을 만든 다음 디스크에 복사본을 쓰는 것입니다. 여러 스레드에서 안전하게 액세스 할 수 없기 때문에 로거도 제거해야합니다.

정말로 내가 왜 이렇게해야하는지 알고 싶습니다.

관련 문제