C#에서는 몇몇 클래스를 통하여 간단히 작성할 수가 있다.

그 예제 코드는 다음과 같다. (MSDN에서 발췌 해 왔다. 보면 -_-;; 알 사람들은 다 알 듯..)

[예제]

        private const String filename = "Test.xml";
        private const String stylesheet = "myStyleSheet.xsl";

            XslTransform xslt = new XslTransform();
            xslt.Load(stylesheet);
            XPathDocument xpathdocument = new XPathDocument(filename);
            XmlTextWriter writer = new XmlTextWriter("testResult1.xml", Encoding.UTF8);
            writer.Formatting = Formatting.Indented;
            xslt.Transform(xpathdocument, null, writer, null);

여기서 보면 xslTransform을 생성하고 해당 xsl 파일을 로드한다.

물론 이것은 사용자가 정의를 해 줘야한다.

필자가 테스트한 myStyleSheet.xsl의 내용은 다음과 같다.

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="Students/Student">
<name><xsl:value-of select="Name"></xsl:value-of></name>
<value><xsl:value-of select="Value"></xsl:value-of></value>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Test.xml의 내용은 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<Students>
<Student>
<Name>test</Name>
<Value>10</Value>
</Student>
</Students>

이것을 실행하여 새로운 파일을 생성한다면 그 안의 내용은

<name>test</name>
<value>10</value>

로 저장이 된다.

이를 통하여 새로운 데이터들을 정의하여 원하는 방식으로 뽑아 쓸 수 있다.

MSDN은 역시 보물 창고다!! ㅠ_ㅠ

무턱대고 네이버나 이런데서 찾는 사람들이 없기를 바라며..


흠.. 일반적으로 닷넷에서 정해진 폼이 있다. 하지만 원하는 메세지들 내용 등을 바꾸자면 아래 예제 코드와 같이 가능하다.

*예제 코드*

public class MessageBoxChange
    {
        delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr SetWindowsHookEx(int hook, HookProc callback, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern IntPtr GetDlgItem(IntPtr hDlg, DialogResult nIDDlgItem);

        [DllImport("user32.dll")]
        static extern bool SetDlgItemText(IntPtr hDlg, DialogResult nIDDlgItem, string lpString);

        [DllImport("kernel32.dll")]
        static extern uint GetCurrentThreadId();

        static IntPtr g_hHook;

         string yes;
         string no;

        //OK
        public DialogResult Show(string text, string caption, string ok)
        {
            this.yes = yes;
            this.no = no;
            g_hHook = SetWindowsHookEx(5, new HookProc(HookWndProc), IntPtr.Zero, GetCurrentThreadId());
            return MessageBox.Show(text, caption, MessageBoxButtons.OK, MessageBoxIcon.Question);
        }

        //YES NO
        public DialogResult Show(string text, string caption, string yes, string no)
        {
            this.yes = yes;
            this.no = no;
            g_hHook = SetWindowsHookEx(5, new HookProc(HookWndProc), IntPtr.Zero, GetCurrentThreadId());
            return MessageBox.Show(text, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        }

        public int HookWndProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            IntPtr hChildWnd;

            if (nCode == 5)
            {
                hChildWnd = wParam;

                if (GetDlgItem(hChildWnd, DialogResult.OK) != null)
                    SetDlgItemText(hChildWnd, DialogResult.OK, this.yes);

                if (GetDlgItem(hChildWnd, DialogResult.Yes) != null)
                    SetDlgItemText(hChildWnd, DialogResult.Yes, this.yes);

                if (GetDlgItem(hChildWnd, DialogResult.No) != null)
                    SetDlgItemText(hChildWnd, DialogResult.No, this.no);

                UnhookWindowsHookEx(g_hHook);
            }
            else
                CallNextHookEx(g_hHook, nCode, wParam, lParam);

            return 0;
        }
    }

당연히 주의해야할 점은 네임스페이스다.

이들은 Forms를 참조하는 다이얼로그와 P-INVOKE를 이용하기 위한 InteropServices 의 네임스페이스를 참조해야한다.

이를 꼭 명심하자!!

1. BackgroundWorker는 ComponentModel 네임스페이스를 이용해야 쓸 수 있다.

2. BackgroundWorker bw = new BackgroundWorker(); 로 생성한다.

3. bw.WorkerSupportsCancellation = true; 설정을 해 준다.

4. bw.DoWork += new DoWorkEventHandler(bw_DoWork); 의 이벤트 핸들러를 생성한다.

5. bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);의 이벤트 핸들러를 생성한다.

6. DoWork 내부에 쓰레드에 이용할 내용을 첨부한다.

7. RunWorkerCompleted 내부에 쓰레드 종료시 이용할 내용을 첨부한다.

if (e.Error != null){} 에러 발생 시 처리
else if (e.Cancelled){bw.CancelAsync();}사용자에 의해 종료 되었을 시 처리
else{}정상 종료 되었을 시 처리

물론 이 BackgroundWorker를 실행하기 위해서는 bw.RunWorkerAnsync(); 처리를 해 줘야한다.

게시글 중 하나 이와 유사한 글이 있다. 그 부분은 단시 쓰는 방법에 대한 것만 나와있다.

쓰레드가 완료 된 처리 내용에 대한 것은 없는 껍데기에 불과 하다는 이야기다.

앞으로 좀 더 잘 알아보고 블로깅을 해야지.. ㅠ_ㅠ 이거 원..