XmlDocument Transform의 경우에는 아래와 같이 하시면 됩니다.

2009/01/13 - [CSharp/Development] - Xml Xslt Transform with C#


요즘 XDocument를 많이 사용하고 있어서 Extensions 매소드로 따로 만들어 보았습니다.

별로 어려운 부분은 없으며, 그냥 아래 코드를 참고 하시면 될 것 같습니다.


Extension Method

public static class XDocExtensions
{
	#region // static string GetTransformation(this XDocument xDoc, string strXslPath) //
	/// <summary>
	/// XDocument에 Xsl를 트랜스포메이션 한 후 해당 데이터를 반환한다.
	/// </summary>
	/// <param name="xDoc">Xml Doc</param>
	/// <param name="strXslPath">Xsl Path</param>
	/// <returns>Transform Data</returns>
	public static string GetTransformation(this XDocument xDoc, string strXslPath)
	{
		string strResult = String.Empty;
		XslCompiledTransform xsl = new XslCompiledTransform(true);
		xsl.Load(strXslPath);

		using (var ms = new MemoryStream())
		{
			XmlWriterSettings settings = new XmlWriterSettings()
			{
				ConformanceLevel = ConformanceLevel.Auto
			};

			using (var writer = XmlWriter.Create(ms, settings))
			{
				xsl.Transform(xDoc.CreateReader(), writer);

				writer.Flush();
				ms.Position = 0;

				strResult = Encoding.UTF8.GetString(ms.GetBuffer());
			}
		}

		return strResult;
	}
	#endregion
}


아래는 해당 메소드 호출 부분입니다.

XDocument doc = new XDocument(
	new XElement("Roots",
		new XElement("Item", "1")
		, new XElement("Item", "2")));

string strTransformData = String.Empty;
strTransformData = doc.GetTransformation(Server.MapPath(strXslPath));

 

이상입니다.

감사합니다.


 

C# 이 번주 월요일과 금요일 가져오는 방식

 

내가 왜.. 이런걸 포스팅 하고 있는지 모르겠지만.

결론은 코드 *_*;;;

 

DateTime dtToday = DateTime.Now;

System.Globalization.CultureInfo ciCurrent = System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek dwFirst = ciCurrent.DateTimeFormat.FirstDayOfWeek;
DayOfWeek dwToday = ciCurrent.Calendar.GetDayOfWeek(dtToday);

int iDiff = dwToday - dwFirst;
DateTime dtFirstDayOfThisWeek = dtToday.AddDays(-iDiff + 1);
DateTime dtLastDayOfThisWeek = dtFirstDayOfThisWeek.AddDays(4);
MessageBox.Show(dtFirstDayOfThisWeek.ToLongDateString());
MessageBox.Show(dtLastDayOfThisWeek.ToLongDateString());

 

DayOfWeek class를 이용하여 가져온다.

해당 class는 여기를 선택하여 확인 하시면 됩니다.

 

이상입니다.~

 

감사합니다.


 

ListItemCollection Sorting 방법

 

허무하다 싶을 정도로 간단하다 *_*;;

 

오랜만에 쓰는 포스팅.. ㅋ

 

// Ascending
ddlFirstClockSetting.DataSource = ddlFirstClockSetting.Items.Cast<ListItem>().OrderBy(o => o.Text).ToList();
ddlFirstClockSetting.DataBind();

// Descending
ddlFirstClockSetting.DataSource = ddlFirstClockSetting.Items.Cast<ListItem>().OrderByDescending(o => o.Text).ToList();
ddlFirstClockSetting.DataBind();

 

날로 먹는 포스팅 ㅡ.ㅡ;;

 

여기서 중요한 것은

using System.Linq;


헌데 결정적인 문제가 있습니다.
바로 Value에 대해서는 처리가 안됩니다.
Value가 있는 경우에는 Value Data가 삭제 됩니다.

위의 Linq 처리 방식은 이게 문제점입니다. *_*;;;;;;;;

for문을 돌면서 Sorting을 해 줘야 Value 까지 다 잘 살아 있습니다.

코드는 아래와 같습니다.

#region SortDropDownList
/// 
/// method to sort a DropDownList
/// 
/// DropDownList to sort
public void SortDropDownList(DropDownList ddl)
{
	ListItem[] sorted = new ListItem[ddl.Items.Count];
	for (int i = 0; i < sorted.Length; i++)
	{
		Array.Resize(ref sorted, i);
		sorted[i] = ddl.Items[i];
	}

	Array.Sort(sorted);

	ddl.Items.Clear();
	ddl.Items.AddRange(sorted);
}
#endregion



이상 입니다.
감사합니다.


 

OpenXml을 이용하여 엑셀 파일의 빈 셀 읽기

 

OpenXml을 이용하면 처음으로 부딪치게 되는 문제가 바로 빈 셀입니다.

저는 이 문제를 DataTable을 이용하여 해결하였습니다.

 

첫 번째 Row가 제목 열이라 생각하고 첫 번째의 Row 정보를 DataTable의 컬럼으로 만들고,

Data에 해당하는 Row를 DataTable에 입력하는 형태로 진행하였습니다.

 

DataTable에 입력하는 방식은 CellType.CellReference의 값을 읽어서 처리하는 형태입니다.

 

아래는 전체 코드입니다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;
using System.IO;
using System.Text.RegularExpressions;

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Wordprocessing;

namespace WebApplication1.OpenXml
{
	public partial class ReadExcelData : System.Web.UI.Page
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(@"C:\test.xlsx", true))
			{
				IEnumerable<Sheet> sheets = myDoc.WorkbookPart.Workbook.Descendants<Sheet>();
				WorksheetPart worksheetPart1 = myDoc.WorkbookPart.GetPartById(sheets.First().Id) as WorksheetPart;
				Worksheet sheet = worksheetPart1.Worksheet;
				IEnumerable<Row> datarow = from row in sheet.Descendants<Row>()
										   where row.RowIndex > 0
										   select row;

				DataTable dt = new DataTable("test");

				int i = 0;
				foreach (Row row in datarow)
				{
					if (i == 0)
					{
						foreach (Cell cell in row.Descendants<Cell>())
						{
							dt.Columns.Add(new DataColumn(GetColumnName(cell.CellReference), typeof(string)));
						}
					}
					else
					{
						DataRow dr = dt.NewRow();
						foreach (Cell cell in row.Descendants<Cell>())
						{
							dr[GetColumnName(cell.CellReference)] = GetCellValue(myDoc, cell, myDoc);
						}

						dt.Rows.Add(dr);
					}

					i++;
				}

				dt.WriteXml(@"C:\test\test11.xml");
			}
		}

		private string GetColumnName(string cellReference)
		{
			Regex regex = new Regex("[A-Za-z]+");
			Match match = regex.Match(cellReference);

			return match.Value;
		}

		private string GetCellValue(SpreadsheetDocument document, Cell cell, SpreadsheetDocument myDoc)
		{
			SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
			string value = cell.CellValue != null ? cell.CellValue.InnerXml : String.Empty;

			if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
				return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
			else if (cell.StyleIndex.InnerText.Equals("1"))
			{
				string strDate = String.Empty;
				DateTime cellDate = DateTime.FromOADate(Convert.ToDouble(cell.CellValue.InnerText));

				if (cellDate != null)
					strDate = cellDate.ToString("yyyy-MM-dd");

				return strDate;
			}
			else
				return value;
		}
	}
}

 

이상입니다.

 

감사합니다~

 

  1. Santi 2011.08.18 08:35

    Oye wey, no te conozco y no me conoces. Es más, ni hablamos el mismo idioma, así que usa Google. Pero, te amo (no homo). Me acabas de dar la solución que necesitaba. ¡Gracias!

    :D

 

OpenXml을 이용하여 엑셀 파일의 날짜 필드(셀) 값 읽어 오기

 

엑셀에서 2011-05-12 와 같이 날짜를 입력하게 되면, 해당 셀은 날짜형 포멧으로 변경되게 됩니다.

 

이를 OpenXml을 이용하여 읽는 방법은 아래와 같습니다.

 

먼저 해당 Excel 파일을 압출 해제 하고 Xml을 확인하게 되면 Sheet1.xml 상에서는 아래와 같이 입력되어 있습니다.

<row r="3" spans="1:3" x14ac:dyDescent="0.3">
	<c r="A3" s="1">
		<v>40310</v>
	</c>
</row>

일반 텍스트의 경우 <c r=”A3” t=”s”>와 같은 형태로 되어  있으나 날짜 형의 경우는 S=”1” S로 시작하게 됩니다.

 

값이 40310 이라는 UInt32Value의 형태로 입력되게 됩니다.

 

변경하는 방법은 C#에서 아래와 같이하면 됩니다.

string strDate = String.Empty;
DateTime cellDate = DateTime.FromOADate(Convert.ToDouble(cell.CellValue.InnerText));

if (cellDate != null)
	strDate = cellDate.ToString("yyyy-MM-dd");

 

위와 같이 변경하는 방법은 standard date의 경우에만 확인하였으며, Formatted date 형의 경우에는 확인하지 못하였습니다.
반대로 적용할 경우에는  DateTime.ToOADate Method로 이용을 하시면 됩니다.

 

해당 date의 number format 확인 방법은 Xml의 Style.xml에서 확인 가능하며, 아래 xml의 numFmtID 값으로 구분하면 됩니다.

<cellXfs count="2">
	<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0">
		<alignment vertical="center"/>
	</xf>
	<xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1">
		<alignment vertical="center"/>
	</xf>
</cellXfs>

 

numFmtId가 14~ 22 Standard

numFmtId가 160~ 이상의 값은 Fomatted date 형이라고 보시면 될 것 같습니다.

 

전체 Sample은 아래에서 확인 할 수 있습니다.

protected void Page_Load(object sender, EventArgs e)
{
	using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(@"C:\test.xlsx", true))
	{
		IEnumerable<Sheet> sheets = myDoc.WorkbookPart.Workbook.Descendants<Sheet>();
		WorksheetPart worksheetPart1 = myDoc.WorkbookPart.GetPartById(sheets.First().Id) as WorksheetPart;
		Worksheet sheet = worksheetPart1.Worksheet;
		IEnumerable<Row> datarow = from row in sheet.Descendants<Row>()
									where row.RowIndex > 0
									select row;

		StringBuilder sbData = new StringBuilder();
		foreach (Row row in datarow)
		{
			foreach (Cell cell in row.Descendants<Cell>())
			{
				string strData = String.Format("cell.CellReference={0}, cell.value={1}", GetColumnName(cell.CellReference), GetCellValue(myDoc, cell, myDoc));
				sbData.AppendLine(strData);
			}
		}

		lblTest.Text = sbData.ToString();
	}
}

private string GetColumnName(string cellReference)
{
	Regex regex = new Regex("[A-Za-z]+");
	Match match = regex.Match(cellReference);

	return match.Value;
}

private string GetCellValue(SpreadsheetDocument document, Cell cell, SpreadsheetDocument myDoc)
{
	SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
	string value = cell.CellValue != null ? cell.CellValue.InnerXml : String.Empty;

	if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
		return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
	else if (cell.StyleIndex.InnerText.Equals("1"))
	{
		string strDate = String.Empty;
		DateTime cellDate = DateTime.FromOADate(Convert.ToDouble(cell.CellValue.InnerText));

		if (cellDate != null)
			strDate = cellDate.ToString("yyyy-MM-dd");

		return strDate;
	}
	else
		return value;
}

 

 

이상입니다.

감사합니다.

 

닷넷(.NET Framework) 버전 별 새로운 기능에 대하여..

 

현재 .net 버전은 4.0까지 나와 있습니다.

.net을 처음 접하시는 분은 바로 4.0이나 혹은 3.5를 다루게 되는데요.

 

새로운 기능들에 대해서 히스토리 문서를 작성합니다.

 

.net의 버전 종속성은 여기를 선택하여 이동하시고, 아래 이미지와 버전별 기능을 참고 하시면 어떤 식으로 흘러왔는지에 대한 흐름을 대충 파악하실 수 있을 것 같습니다.

 

 

.NET Framework 버전(VS 버전) 설명

 

  1. 1.0 (Visual Studio .NET)
    첫 번째 버전의 CLR 및 기본 클래스 라이브러리 파일의 첫 번째 버전은 포함되어 있습니다.
  2. 1.1 (Visual Studio .NET 2003)
    ASP.NET 및 ADO.NET 업데이트가 포함됩니다. 이 버전은 계속해서 두 번 서비스 팩 1 (SP1) 업데이트된 SP2 및. 또한 이 버전에 대해 여러 버전의 CLR 실행하려면 응용 프로그램이 단일 컴퓨터에서 side-by-side 실행이 도입되었습니다.
  3. 2.0 (Visual Studio 2005)
    새로 추가된 제네릭과 제네릭 컬렉션, ASP.NET 상당한 추가 등 기본 클래스 라이브러리 사용하여 CLR 버전이 도입되었습니다. 이 버전의 SP1 및 SP2 이후에 업데이트되었습니다.
  4. 3.0 (Visual Studio 2005)
    기본적으로 .NET Framework 2.0 Windows 프레젠테이션 파운데이션 (WPF만), Windows 통신 기반 (WCF), Windows 워크플로 파운데이션 (WF) 및 CardSpace 추가된 버전입니다. SP1 및 SP2 이후에 업데이트되었습니다.
  5. 3.5 (Visual Studio 2008)
    AJAX 사용 웹 사이트와 LINQ 같은 새로운 기능을 추가했습니다. SP1 업데이트를 .NET Framework 클라이언트 프로필, 동적 데이터 집합이 추가 기능이 추가되었습니다.
  6. 4 (Visual Studio 2010)
    새 버전의 CLR, 확장된 기본 클래스 라이브러리 및 확장성 관리 프레임워크 (MEF), 동적 언어 런타임 (DLR) 코드 계약을 같은 새로운 기능이 포함되어 있습니다.

 

좀 더 자세한 .NET Framework 버전의 새로운 기능은 아래를 참고하여 주십시오.

 

.NET Framework 버전 2.0의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/t357fb32.aspx

 

C# 2.0 언어 및 컴파일러의 새로운 기능 새로운 창으로 보기

 

.NET Framework 버전 3.0의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/aa480198.aspx

3.0에서 WPF(Windows Presentation Foundation), WCF(Windows Communication Foundation), WF(Windows Workflow Foundation) 그리고 Windows CardSpace의 기술이 나옵니다.

 

소개 자료 : Introducing the .NET Framework 3.0(영문)

WPF, WCF, WF 등의 기술적 상세 내용은 3.5에서 좀 더 구체화 되었습니다.

 

그리고 C#의 새로운 기능으로 몇 가지가 추가되었는데 중요한 부분입니다.

 

해당 내용은 여기를 선택하여 새로운 창으로 확인 할 수 있습니다.

 

여기를 선택하여 새로운 창으로 3.0의 새로운 기능을 샘플로 확인 할 수 있습니다.

 

.NET Framework 버전 3.5의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/bb332048(v=vs.90).aspx

.NET Framework 버전 3.5 SP1의 새로운 기능 : 여기를 선택하여 새로운 창으로 이동

 

 

.NET Framework 4의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/ms171868.aspx

 

 

C#의  가장 큰 변화는 Dynamic입니다.

 

새로운 기능에 대한 내용 : 새로운 창으로 이동(Blog)

병렬 프로그래밍에 대한 내용 : 새로운 창으로 이동(Blog)

 

이상으로 .NET Framework의 버전별 새로운 기능들에 대해서 알아보았습니다.

 

C#에서는 역시 3.0, 3.5에서 가장 큰 변화가 있었던 것 같습니다.

LINQ라던지… 2.0의 세상도 넓다는 것을 알 수 있었고요..

 

추후 버전이 바뀌거나 SP가 나오는 경우에는 새로운 포스트로 찾아 뵙도록 하겠습니다.

그때는 항상 코드와 함께~

 

 

감사합니다.

 

뉴스레터로 항상 트레이닝 킷이 날아 오는걸 방치하다가.

오늘은 한번 설치 해 보았습니다.

개발자라면.. 신규 기능에 대해서 알고 있을 필요가 있을 것 같아.. 이렇게 올려 봅니다.

 

오늘은 소개해 드릴 건 VS 2010 및 .NET Framework 4 트레이닝 킷 입니다.

http://www.microsoft.com/downloads/en/details.aspx?familyid=752CB725-969B-4732-A383-ED5740F02E93&displaylang=en

 

178 Mbyte정도 되고요..

설치파일 하나이며, 설치하게 되면 아래와 같은 화면을 볼 수 있습니다.

 

 

여기서 우측 메뉴의 ASP.NET 4를 선택하여 이동하게 되면

ASP.NET MVC, 새로운 기능, 개발툴, 에 관한 자료(동영상, pptx 등)를 볼 수 있습니다.

 

비디오의 경우 각 세션 별로 진행되니.. 도움이 되시리라 생각됩니다.

 

기초적인 기술들이지만 Parallel, Sharepoint, MVC 등등 아주 유용한 자료가 많이 있습니다.

꼭 참고해 보시면 좋은 것 같습니다.

 

이상입니다.

감사합니다.


  1. Favicon of http://itopen.tistory.com BlogIcon AW메모리얼 2011.01.19 16:52

    asp.net은 구조 자체로 MVC를 지원하는건가요?
    jsp는 Struts 같은 프레임워크를 사용해서 구축해줘야 하더라구요

    • Favicon of http://angeleyes.tistory.com BlogIcon Angeleyes 2011.01.19 23:01

      mvc 설치파일과 vs 익스텐션만 설치하시면 사용할 수 있습니다..
      자바보다 설정등등 훨씬 쉬운것으로 알고 있습니다. ^^

FileInfo 를 이용해서 파일을 잡고
파일을 읽고, 쓰는 방법에 대해서 알아 보도록 하겠습니다.

System.IO.FileInfo fi = new System.IO.FileInfo(@"C:\test.txt");

// 파일이 없다면 생성
if (!fi.Exists) fi.Create();

// OpenRead 파일을 읽을 때
// OpenWrite 파일을 생성해서 바로 쓸때(이전 데이타가 없다고 가정하고 쓰는 경우) 이전 데이타가 있으면 그 내용은 그대로 존재
// Open(System.IO.FileMode.Create) FileStream 형태를 직접 제어 하는 경우 아래와 같은 경우에는 무조건 새로 쓰는 경우
//using (System.IO.FileStream fs = fi.OpenRead())
//using (System.IO.FileStream fs = fi.OpenWrite())
using (System.IO.FileStream fs = fi.Open(System.IO.FileMode.Create))
{
	// System.StreamWriter를 이용하지 않고 직접 FileStream을 이용해서 쓰는 방법
	//Byte[] info = new UTF8Encoding(true).GetBytes("1234567890");
	//fs.Write(info, 0, info.Length);
	
	// 쓰는 위치를 선택한다. Begin(시작), End(마지막)
	//fs.Seek(0, System.IO.SeekOrigin.End);
	//fs.Seek(0, System.IO.SeekOrigin.Begin);

	// 파일 읽기
	//using (System.IO.StreamReader sr = new System.IO.StreamReader(fs))
	//{
	//    string strTempText = sr.ReadToEnd();
	//    sr.Close();
	//}

	// 파일 쓰기
	using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fs))
	{
		sw.Write("1234567890");
		sw.Close();
	}
	fs.Close();
}

// 작성 된 파일 실행
using (System.Diagnostics.Process ps = new System.Diagnostics.Process())
{
	ps.StartInfo.FileName = @"C:\test.txt";
	ps.Start();
	ps.Close();
}

우선 코드는 위와 같습니다.

저는 FileInfo 에서 FileStream으로 넘겨 줄때 File의 Mode 설정 때문에 좀 고생을 했었는데요.
알고 보면 매우 간단합니다.

위 코드에 자세한 내용은 아래(MSDN)를 참고 하시기 바랍니다.

FileInfo Class (System.IO) http://msdn.microsoft.com/ko-kr/library/system.io.fileinfo.aspx
FileStream Class (System.IO) http://msdn.microsoft.com/ko-kr/library/system.io.filestream%28VS.80%29.aspx
StreamReader Class (System.IO) http://msdn.microsoft.com/ko-kr/library/system.io.streamreader%28VS.80%29.aspx
StreamWriter Class (System.IO) http://msdn.microsoft.com/ko-kr/library/system.io.streamwriter%28VS.80%29.aspx

이상입니다.

System.Text.dll 과 같은 시스템 dll 디버깅 방법을 소개해 드리도록 하겠습니다.

 

vs 2005 debugging 방법을 이번 포스트에서 소개 해 드리고 다음번에 2008 방법을 소개해 드리도록 하겠습니다.

사용해 본 결과 vs 2005는 까다롭고 *_*;;

 

vs 2008은 엄청나게 쉽습니다. *_*;;

 

Google Search 결과 CodePlex에서 NetMassDownloader 라는 프로젝트로 진행되어서 있더군요 *_*;;

영어가 짧아서 자세한 건 잘 모르지만서도 *_*;

 

여기에서 아래와 같은 방법으로 vs 2005, 2008을 동일하게 작업 하실 수 있습니다.

 

http://netmassdownloader.codeplex.com/

 

저는 Feature Release 1.5.0.1 이놈을 다운 받아서 진행하였습니다.

 

 

좌측에 보이는 Downloads 를 통하여 직접 다운 받았습니다.

 

다운 받아서 압축을 풀어 보시면 아래와 같이 생겨 있습니다.

도움말도 포함되어 있구요 *_*

 

 

캡쳐 화면을 자세히 보시면 스펨신고라고 나오는데요 *_*;;;;;;;;;;;;;;;;;

 

이놈이 제가 windows server 2008 R2를 사용하고 있는데.. 저런 식으로 잔상이 낳아 있어요 *_*;;

이거 없애는 방법 아시는 분 가르쳐 주세요. 왜 생기는 지도 모르겠고요 *_*;;;;;;;

 

명령프롬프트를 통해서 지금 압축이 풀어져 있는 디렉토리로 들어오셔도 되고 아니면 해당 경로를 입력하셔도 됩니다.

NetMassDownloader.exe 를 실행시키려고 하는 것입니다. *_*

 

그리고 아래와 같은 명령어를 입력하시면 됩니다.

 


NetMassDownloader.exe -d "C:\Windows\Microsoft.NET\Framework64\v2.0.50727" -output "D:\ReferenceSource"


NetMassDownloader.exe -d "C:\Windows\Microsoft.NET\Framework\v2.0.50727" -output "D:\ReferenceSource"

 

위와 같이 입력하시면 됩니다. *_*

 

 

 

이렇게 압축이 자동으로 풀립니다.

어마어마한 파일들이 있는 관계로 시간이 좀 많이 걸립니다. *_*

 

 

대략 한 시간 정도 걸린 것 같습니다. 우웩

 

 

 

 

도구 –> 옵션 –> 디버깅

 

위의 이미지에서 아래와 같이 변경되어야 합니다.

 

 

기호로 넘어가셔서 추가 되어야 합니다.

 

기호 파일(.pdb) 위치(L): 에 폴더를 클릭하셔서 압축을 푼 디렉토리로 설정하시면 됩니다.

“D:\ReferenceSource”

 

확인을 선택하게 되면 아래와 같이 나타납니다.

 

 

설정은 이제 끝났습니다.

이제 직접 디버깅을 해 보도록 하겠습니다.

 

반듯이 기호 로드를 먼저 하셔서 기호를 로드 하신 후 작업하셔야 됩니다.

기호를 로드 하는 방법은 두 가지가 있습니다.

 

첫 번째는 Ctrl + Alt + U를 선택하셔서

 

 

원하는 Dll에 기호 로드를 선택하시면 됩니다.

이왕이면 mscorlib.dll 에 기호로드를 선택하시면 좋을 것 같습니다.

 

 

로그하게 되면 아래와 같이 기호파일이 선택한 경로로 설정 되는 것을 볼 수 있습니다.

 

 

디버깅을 원하는 dll에 기호를 로드하셔야 소스를 확인 할 수 있습니다.

그리고 아래와 같이 연결하는 방법도 있으나 좀더 디테일하게 디버깅이 되지 않아 아래 방법은 권장 하지 않습니다.

 

 

 

디버깅할 호출 스택을 선택하고 기호 로드를 선택하게 됩니다.

 

자 그럼 직접 디버깅을 걸어 보도록 하겠습니다.

 

 

StringBuilder를 디버깅하려면 System.dll에 기호가 로드 되어 있어야 됩니다.

 

기호를 로드하게 되면 최초에 아래와 같은 확인 창이 나타나게 됩니다.

 

 

최초 한번만 나타나고 그 다음에는 나타나지 않습니다. *_*;;

 

 

보안 경고 메시지가 나타나는데 dll을 처음 로드 할때마다 실행됩니다. *_*;;

 

 

예.. 저는 연결하였습니다.

 

 

이렇게 디버깅이 가능합니다.

어떻게 보면 소스를 확인하는 것 밖에 되지 않습니다.

헌데 어떤 식으로  코드가 짜여져 있는지 확인 할 수 있으니 참 좋은 것 같습니다.

 

좀 더 열심히 공부해야겠군요 *_*;;

그리고 최적화된 코드를 앞으로는 짤 수 있을 듯 한데.. ㅋㅋ

C#

/// <summary>
/// Xml, Xslt를 Transform 한 Data를 Return 한다.
/// </summary>
/// <param name="doc">Xml 문서</param>
/// <param name="xsltPath">Xslt 절대경로</param>
/// <returns>Transoform string Data</returns>
#region // string XmlTranseform(XmlDocument doc, string xsltPath) //
public string XmlTranseform(XmlDocument doc, string xsltPath)
{
	XslCompiledTransform xtData = new XslCompiledTransform();
	xtData.Load(xsltPath);

	StringWriter swData = new StringWriter();
	xtData.Transform(doc, null, swData);

	return swData.ToString();
}
#endregion

/// <summary>
/// Xml, Xslt를 Transform 한 Data를 Return 한다.
/// </summary>
/// <param name="strXml">Xml String Data</param>
/// <param name="xsltPath">Xslt 절대경로</param>
/// <returns>Transoform string Data</returns>
#region // string XmlTranseform(string strXml, string xsltPath) //
public string XmlTranseform(string strXml, string xsltPath)
{
	XmlDocument doc = new XmlDocument();
	doc.LoadXml(strXml);

	XslCompiledTransform xtData = new XslCompiledTransform();
	xtData.Load(xsltPath);

	StringWriter swData = new StringWriter();
	xtData.Transform(doc, null, swData);

	return swData.ToString();
}
#endregion

+ Recent posts