출처는 보시다시피 MSDN !!
시나리오.
간단합니다. RichTextBox에 있는 텍스트와 이미지를 XML에 저장하고 다시 불러들이는 시라니로입니다.
주의사항!! 제가 지금 만든거는 순서대로 불러들이지 않습니다!! ㅠㅠ 지금 프로젝트 진행중이라 이거에만 매달릴 수 없어서 못하고있지만 꼭 시간나면 만들겠슴!!   방식만 참고하세요ㅠㅠ;;

  http://www.codeproject.com  <-요 사이트 다들 아시죠? 여기서 에디터는 가져왔습니다. 버튼만 2개 추가했슴죠 -0-;;

일단 전역으로 ArrayList와 byte[] 배열 변수를 선언하였습니다.

byte[] photo = null;   //Image 저장 변수

ArrayList bnt = new ArrayList();  //image 담는 ArrayList입니다. photo를 담는거지요. 이미지를 추가시켜줄때마다 ArrayList에 담아줍니다.

 private void tsbtnInsertPicture_Click(object sender, EventArgs e)

{

     using (OpenFileDialog dlg = new OpenFileDialog())

     {

         dlg.Title = "Insert picture";

         dlg.DefaultExt = "jpg";

         dlg.Filter = "Bitmap Files|*.bmp|JPEG Files|*.jpg|GIF Files|*.gif|All files|*.*";

         dlg.FilterIndex = 1;

         if (dlg.ShowDialog() == DialogResult.OK)

         {

            try

            {

                string strImagePath = dlg.FileName;

                Image img = Image.FromFile(strImagePath);

                Clipboard.SetDataObject(img);

                DataFormats.Format df;

                df = DataFormats.GetFormat(DataFormats.Bitmap);

                if (this.rtbDocument.CanPaste(df))

                {

                    this.rtbDocument.Paste(df);

 

                    photo = GetPhoto(dlg.FileName);   //photo에 담아두기

                    bnt.Add(photo);                   //ArrayList에 담기

                }

 

            }

            catch

            {

                MessageBox.Show("Unable to insert image.", "Error"MessageBoxButtons.OK, MessageBoxIcon.Error);

                    }

                }

            }

}





 여기서도 등장하는 포토함수~

public static byte[] GetPhoto(string filepath)   //이미지 저장 함수.

{

       FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read);

       BinaryReader reader = new BinaryReader(stream);

       byte[] photo = reader.ReadBytes((int)stream.Length);

       reader.Close();

       stream.Close();

       return photo;

  }









 Xml저장하는 버튼 코드입니다. DataSet을 만들고 테이블을 추가후 Column과 Row을 생성 후 텍스트와 이미지를 저장해주는 겁니다.

private void toolStripButton1_Click_1(object sender, EventArgs e)   //XML 저장

{

      DataSet ds = new DataSet();

      DataTable dt = new DataTable("myTable");

 

      DataColumn dc = new DataColumn("Content", typeof(string));  //본문내용

      dt.Columns.Add(dc);

 

      int imageCnt = bnt.Count;

 

      for (int i = 0; i < imageCnt; i++) //ArrayList에 담은 수만큼 Colmn생성

      {

          dc = new DataColumn("image" + i.ToString(), typeof(byte[]));  //이미지

          dt.Columns.Add(dc);

      }

 

     ds.Tables.Add(dt);

     DataRow dr = dt.NewRow();

 

     dr["Content"] = rtbDocument.Text;   //본문내용

 

     for (int i = 0; i < imageCnt; i++)  //ArrayList에 담은 수만큼 row에 이미지를 담음

     {

         dr[i+1] = bnt[i];          //이미지

     }

     ds.Tables["myTable"].Rows.Add(dr);

 

     SaveFileDialog save = new SaveFileDialog();

     save.Filter = "xml file (*.*)|*.*"; //파일 필터링

 

     if (save.ShowDialog() == DialogResult.OK)

     {

         ds.WriteXml(save.FileName);  //XML Write.

     }

}



xml을 로드 시켜주는 버튼 소스입니다. 
private void toolStripButton2_Click(object sender, EventArgs e)   //XML 로드

{

      OpenFileDialog dlg = new OpenFileDialog();

      dlg.DefaultExt = ".xml";  //기본 확장자

      dlg.Filter = "Xml Files(.xml)|*.xml"; // 확장 파일 필터

      dlg.ShowDialog();

 

      DataSet ds = new DataSet();

 

      try

      {

          ds.ReadXml(dlg.FileName);

          LoadXml(ds);  // XML 읽어주기 함수

      }

      catch { }

}

 

private void LoadXml(DataSet ds)  // XML 읽어주기 함수

{

      byte[] myData = null;

 

      string str;

      MemoryStream mem;

      Bitmap bmp;

 

      foreach (DataTable table in ds.Tables)

      {

          foreach (DataRow row in table.Rows)

          {

              rtbDocument.Text = row[0] as string;

              for (int i = 0; i < table.Columns.Count; i++)
              {
                  str = row["Image" + i.ToString()].ToString();
                  myData = Convert.FromBase64String(str); //byte[] 컨버트해줌
                  mem = new MemoryStream(myData);
                  bmp = new Bitmap(mem); //byte[] -> bitmap변환
                  Clipboard.Clear();
                  Clipboard.SetImage(bmp);
                  rtbDocument.Paste();

              }

          }

      }
}



p.s 지금 피곤해서 빼먹은게 있으려나 -,,- 그리고,
순서대로 담는 방법을 아시는분!! 알려주십시오!!!ㅠㅠ 하악하악ㅠㅠ 
C#, CLR

  네이티브 코드 ->네이티브 코드 컴파일러의 결과물은 CPU에 의존적이다, 즉 컴파일하기 전에 명시적 혹은 묵시적으로 x86, x64, IA84와 같은 여러 CPU중 어느 CPU를 대상으로 컴파일을 수행할 것인지 미리 설정해 주어야 함. 
☞ 컴파일의 결과물(exe 또는 dll)이 어느 CPU를 대상으로 배포될 것인지에 따라 다른 결과물이 생성된다

 닷넷 -> 닷넷을 지원하는 모든 컴파일러들은 그 결과물이 중간 언어(IL:Intermediate Language)라는 코드로서 CPU와는 상관없이 동일한 형태의 결과물을 만들어낸다.

 ☞ CLR이  IL코드의 실행을 관리함으로 종종 관리되는 코드(managed code) 혹은 관리코드라고도 한다.

 IL 코드에 대해서 좀 더 언급하면, CLR을 지원하는 모든 컴파일러는 일정한 형식의 메타 데이터를 관리되는 모듈에 포함하게 되어 있다. 

 메타데이터는 관리되는 모듈에 정의되어 있는 것들 (예를 들면, 클래스와 클래스의 멤버, 구조체등)의 목록과 기초적인 정보를 저장해 놓은 일종의 데이터 테이블이라고 한다. 따라서 이 테이블만 확인하면 해당 모듈에서 어느 타입들이 정의되어 있는지 쉽게 확인 할 수있다.

  메타데이터의 사용 용도
  
  ->  메타데이터의 존재는 컴파일러가 컴파일 수행 시 기존의 헤더 혹은 라이브러리 파일 같은 것이 없어도 컴파일을 가능하게 해준다. 이미 모든 정의된 타입과 참조된 타입의 정보가 실행 파일에 자세하게 기록되어 있으므로 컴파일러는 이러한 정보를 관리되는 모듈에서 정확하게 읽을 수 있다.
 
  -> 개발자가 코드를 작성할 떄 메타데이터 정보를 읽고서 메서드, 속성, 이벤트, 멤버 등의 정보를 미리 보여줄 수 있다. 그 대표적인 예가 Visual Studio의 인텔리센스 기능이다.

  -> CLR의 코드 검증 기능은 메타데이터의 정보를 통해 해당 실행 파일이 안전하게 실행될 수 있는지 확인할 수 있다.

  -> 객체의 상태를 보존할 수 있또록 Serialize 혹은 Deserialize 를 가능하게 해준다. 객체의 상태를 메모리 블록에 serialize한 후 원격 PC에 전송하고 다시 deserialize 하여 결과적으로 객체의 상태를 원격 PC에 전송 가능하게 할 수 있는 것도 메타데이터가 있기 때문에 가능한 것이다.

  -> 가비지 수집기가 객체의 수명(LifeTime)상태를 조사하여 수집 대상을 확인하는데 도움을 준다.

+ Recent posts