회사에는 FarPoint라는 이쁘고 쉽게 구현 가능한 컴퍼넌트가 있습니다. 제가 잘 사용 못하는건지 맨 처음 메모리에 올릴 때 화면이 늦게 떠서 이번 프로젝트에는 성능 좋은 DataGridView를 이용하였습니다. Column 7개에 30~500개 되는 Row를 추가해 주어야 하였습니다.

 

(바인딩을 이용하진 않았습니다. 직접 Colume, Row에 Index로 접근하여 데이터를 삽입하는 것도 같은 성능 개선 효과를 내기 때문에 바인딩에 신경 안쓰셔도 됩니다.)

 

아래와 같이 DataGridView의 AutoSizeColumnsMode를 AllCells로 지정하고 바인딩하였습니다.

Column 크기를 제가 직접 작성하기 귀찮아서 AutoSize모드를 설정하였었습니다.

그런데 이상하게 너무 느린겁니다. 30개 정도 DataGridView에 넣는데는 상관없지만 500개이상되면 5초 이상 걸리게 되었습니다.

/// <summary>

        /// 좋지 않은 예제

        /// </summary>

        /// <param name="dt"></param>

        private void StartBadExample(DataTable dt)

        {

            //AutoSizeColumnMode None 아닌것으로 설정

            this.dgv_test.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

 

            this.dgv_test.SuspendLayout();

 

            System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();

            st.Start();

            this.dgv_test.DataSource = dt;

            st.Stop();

            System.Diagnostics.Debug.WriteLine(st.Elapsed.ToString());

 

            this.dgv_test.ResumeLayout();

        }

 

 

그래서 이것저것 찾아본 결과 답을 얻게 되었습니다.

코드 내용은 아래와 같습니다.

/// <summary>

        /// 좋은 예제

        /// </summary>

        /// <param name="dt"></param>

        private void StartGoodExample(DataTable dt)

        {

            this.dgv_test.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

 

            this.dgv_test.SuspendLayout();

           

            System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();

            st.Start();

            this.dgv_test.DataSource = dt;

            st.Stop();

            System.Diagnostics.Debug.WriteLine(st.Elapsed.ToString());

 

            //AutoSizeColumnsMode 변경

            this.dgv_test.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

 

 

            //TopLeftHeaderCell 또는 RowHeader 이용한다면 변경

            this.dgv_test.RowHeadersWidth = 100;

 

            this.dgv_test.ResumeLayout();

        }

 

 

데이터 삽입 전 AutoSizeColumnsMode를 DataGridViewAutoSizeColumnsMode.None으로 설정 하시고, 데이터를 모두 삽입한 후 AutoSizeColumnsMode를 원하시는 것으로 변경해주시면 되겠습니다.

 

DataGridView의 Cell 그리는 로직은 AutoSizeColumnsMode의 값이 None이 아닐 경우에는 이전 그려진 Cell들을 다시 그리느냐고 느려지는 것 같습니다.

 

Column 10개, Row 300개로 테스트 한 결과는 아래와 같이 엄청난 차이를 보입니다.

StartBadExample의 시간: 00:00:00.3024992

StartGoodExample의 시간: 00:00:00.0000006

C#, Java로 구현 되어 있는 프로젝트를 클래스 다이어그램입니다.

이름은 ALTOVA umodel2013 입니다.

프로젝트 경로만 설정해주면 자동으로 클래스 다이어그램을 만들어주어서 편리합니다.

아래는 해당 프로그램을 이용해서 만든 클래스 다이어그램입니다.

[이미지 1] Class 다이어그램 결과

 

http://www.altova.com/download.html

위의 링크로 이동하셔서 아래의 이미지를 따라하시면 되겠습니다.

 

[이미지 2] – Download 방법(1)

 

[이미지 3] – Download 방법(2)

자신의 운영체제에 맞는 것으로 선택하여 다운로드를 받으신 후 실행시키시면 이름, 회사 이름, 이메일 주소를 입력하시면 30일 평가판 코드를 이메일로 받으실 수 있습니다.

 

프로그램을 실행 시키신후 Project->Import Source Project로 이동합니다.

[이미지 4] – 프로젝트 불러오기

 

 

 

 

 

 

 

 

 

 

 

 

저는 Visual Studio 2012 C# 4.0으로 개발하였기 때문에 C#4.0으로 선택 후 Project파일을 경로를 설정하였습니다.

[이미지 5] – 프로젝트 경로 설정

 

다음은 생성할 다이어그램에 대한 설정입니다. 설정을 한 후 다음을 누릅니다.

[이미지 6] – 생성할 다이어그램 설정(1)

 

 

[이미지 7] – 생성할 다이어그램 설정(2)

 

 

마침 버튼을 누르시면 파싱 작업 및 다이어그램 생성 작업을 진행합니다.

아래의 이미지와 같이 진행하시면 생성한 클래스 다이어그램을 확인 및 수정 하실수있습니다.

[이미지 7] – 생성한 다이어그램 열기

'유용한 프로그램' 카테고리의 다른 글

토렌트3.0  (0) 2013.02.09
이미지 파일을 아이콘 파일로 변경  (0) 2012.08.09
순서도(Flow Chart) SmartDraw  (0) 2012.07.12

Winform의 ListView를 사용하다보면 한개 이상의 ListViewItem을 추가할때가 있습니다.

그럴때 BeginUpdate와 EndUpdate를 이용하면 깜빡임을 최소화하고 아이템들이 추가되는 시간을 줄 일 수있습니다.

 

ListView의 Item 추가하는 로직은 잘 모르겠지만 제 생각에는 아래와 같은 구조일 것 같습니다.

 

 

         

/// <summary>

        /// 기존 System.Windows.Forms.ListViewItem 컬렉션에 추가합니다.

        /// </summary>

        /// <param name="?"></param>

        public void Add(ListViewItem value)

        {

            //Dowork..

 

            //BeginUpdate Count 0 아니라면 컨트롤을 다시 그립니다.

            if(this.beginUpdateCount!=0)

                this.Invalidate();

        }

 

 

MSDN에 ListVIew BeginUpdate에 대한 설명에는 아래와 같이 나와있습니다.

 

BeginUpdate 를 두 번 이상 호출하는 경우 EndUpdate를 같은 횟수만큼 호출해야 합니다. EndUpdate 를 마지막으로 호출한 후에 ListView가 다시 그려집니다.이렇게 하지 않으면 BeginUpdate를 여러 번 호출해도 효과가 없습니다.

참고 : http://msdn.microsoft.com/ko-kr/library/60dc8hf5(v=vs.100).aspx

 

즉, BeginUpdate를 호출하면 ListView 컨트롤을 다시 그리지 않습니다.

아이템을 추가하기 전에 BeginUpdate 메서드를 호출하여 ListView를 다시 그리지 않게 막은 후

아이템을 모두 추가한 후에 EndUpdate 메서드를 호출하여 ListView를 다시그려주게되면 성능이 향상하게 됩니다.

 

아래의 테스트 결과 이미지를 확인해보시면 그냥 Item을 추가한 경우와  BeginUpdate, EndUpdate 메서드를 호출할 때의 성능 차이를 확인 하실수 있습니다.

약 2배의 성능이 향상 되었습니다. 직접 테스트를 진행해보시면 깜빡임도 줄어든것을 확인 하실 수 있습니다.

(ListViewItem 500개 추가할때의 테스트)

 

[이미지 1] 테스트 결과

 

 

 

 

 

 

 

 

 

코드 :

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Diagnostics;

 

namespace TestPerformance

{

    public partial class TestListViewPerformance : Form,ITest

    {

        const string TXT_NOT_USED_UPDATE = "Not call Update mehthod : {0}";

        const string TXT_USED_UPDATE = "Call Update mehthod : {0}";

 

        public TestListViewPerformance()

        {

            InitializeComponent();

        }

 

        /// <summary>

        /// ListViewItem 추가합니다.

        /// </summary>

        /// <param name="isUseUpdateMethod">BeginUpdate, EndUpdate 호출 여부</param>

        /// <param name="lvis">ListViewItem 배열</param>

        private void AddListViewItem(bool isUseUpdateMethod, ListViewItem[] lvis)

        {

            if (isUseUpdateMethod)

            {

                this.lv_test.BeginUpdate();  

            }

 

           

foreach (var item in lvis)

            {

                this.lv_test.Items.Add(item);

            }

            // AddRange 내부적으로 BeginUpdate EndUpdate 호출하는 같습니다.

            //this.lv_test.Items.AddRange(lvis);

 

            if (isUseUpdateMethod)

            {

                this.lv_test.EndUpdate();

            }

        }

       

 

        /// <summary>

        /// BeginUpdate, EndUpdate 사용하지 않는 로직을 수행합니다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btn_notUseUpdate_Click(object sender, EventArgs e)

        {

            Stopwatch sw = new Stopwatch();

 

            this.lv_test.Items.Clear();

            sw.Start();

 

            this.AddListViewItem(false, this.CreateTestListViewItems());

 

            sw.Stop();

           

            Console.WriteLine(string.Format(TXT_NOT_USED_UPDATE,sw.Elapsed.ToString()));

            Debug.WriteLine(string.Format(TXT_NOT_USED_UPDATE, sw.Elapsed.ToString()));

        }

 

        /// <summary>

        /// BeginUpdate, EndUpdate 사용하는 로직을 수행합니다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btn_useUpdate_Click(object sender, EventArgs e)

        {

            Stopwatch sw = new Stopwatch();

 

            this.lv_test.Items.Clear();

            sw.Start();

 

            this.AddListViewItem(true, this.CreateTestListViewItems());

 

            sw.Stop();

 

            Console.WriteLine(string.Format(TXT_USED_UPDATE, sw.Elapsed.ToString()));

            Debug.WriteLine(string.Format(TXT_USED_UPDATE, sw.Elapsed.ToString()));

        }

 

        /// <summary>

        /// Test ListViewItem 생성합니다.

        /// </summary>

        /// <returns></returns>

        private ListViewItem[] CreateTestListViewItems()

        {

            ListViewItem[] lvis = new ListViewItem[500];

 

            for (int i = 0; i < lvis.Length; i++)

            {

                lvis[i] = new ListViewItem(i.ToString());

                for (int j = 1; j < this.lv_test.Columns.Count; j++)

                {

                    lvis[i].SubItems.Add(i.ToString());

                }

            }

 

            return lvis;

        }

 

        public void StartTest()

        {

            throw new NotImplementedException();

        }

    }

}

  

 

Excel 매크로를 C#4.0을 이용해서 쉽게 변환하는 과정의 동영상입니다.

 

 

 

 

 

출처 : MSDN - How Do I: Convert Visual Basic for Applications Macro to C# 4.0

C# 4.0 선택적 매개변수, 명명된 매개변수

 

대전에서 프로젝트를 진행 할 때는 VS2008 C#3.0을 사용해서 잘 몰랐던 부분을

서울에 올라와서 VS2012 C#4.0을 사용하면서 편리함을 느끼고 있네요!

물론 먼저 Raw한 부분부터 경험하는 것은 중요한거죠?^.^ EndUser의 프레임워크 설치도 귀찮게하니..

 

 

C++ 을 보면 Default 매개변수라는 개념이 있습니다.

매개변수를 넘기지 않으면 해당 매개변수는 Default값으로 사용하겠다는 개념입니다.

예를들어 C++ 같은 경우에는 아래와 같이 메서드가 정의되어 있을   Foo(); 요런식으로 호출이 가능합니다. aDefault 값은 0으로 지정해두었으니 정수형 값 1 Return되겠네요.

int Foo(int a=0)

{

     return a+1;

}

 

C#에서는 Default 매개변수라는 개념이 C#4.0 이전까지는 없었습니다.

너무 불편했었습니다….. 예를들어 아래의 코드를 보시면

주소록에 이름과 전화번호를 추가할 때 전화번호는 일단 입력하고 싶지 않을 때,

아래와 같이 오버로딩을 이용하였었습니다.

class Program

    {

        class Man

        {

            public string Name { get; private set; }

            public string CellPhone { get; private set; }

 

            public Man(string name, string cellPhone)

            {

                this.Name = name;

                this.CellPhone=  cellPhone;

            }

        }

 

        class AddressBook

        {

            public List<Man> Mans { get; private set; }

 

            public void CreateMan(string name, string cellPhone)

            {

                Man man = new Man(name, cellPhone);

                this.Mans.Add(man);

            }

            public void CreateMan(string name)

            {

                this.CreateMan(name, "None");

            }

        }

 

        static void Main(string[] args)

        {

            AddressBook addressBook = new AddressBook();

            addressBook.CreateMan("경찰서", "112");

            addressBook.CreateMan("소방서", "119");

            addressBook.CreateMan("새로알게된사람");

        }

    }

 


                                   

오버로딩의 대안을 제시한 새로운 명명된 매개 변수와 선택적 매개 변수 기능이 C# 4.0에 나왔습니다.  위의 코드는 아래와 같이 선택적 매개변수로 깔끔하게 변하였습니다. , 선택적 매개변수는 선택적이지 않은 매개변수의 무조건 뒤쪽에 붙어야 합니다.

        class AddressBook

        {

            public List<Man> Mans { get; private set; }

 

            public void CreateMan(string name, string cellPhone = "None")

            {

                Man man = new Man(name, cellPhone);

                this.Mans.Add(man);

            }

        }

 

        static void Main(string[] args)

        {

            AddressBook addressBook = new AddressBook();

            addressBook.CreateMan("경찰서", "112");

            addressBook.CreateMan("소방서", "119");

            addressBook.CreateMan("새로알게된사람");

        }  

 

 

위의 코드에서 아래와 같이 주소도 추가하였습니다.

public void CreateMan(string name, string cellPhone = "None", string address="None")

{

Man man = new Man(name, cellPhone);

this.Mans.Add(man);

}

 

애매하지요. 이름과 주소만 추가하고싶은데 가운데 전화번호는 어떻게하지?

명명된 매개변수를 이용하면 처리가 가능합니다.  

매개변수명: 매개변수

위와 같이 진행하시면 원하는 매개변수를 지정하여 원하는 데이터를 넘길 수 있습니다.

관심이 없는 매개변수는 그냥 내버려두시면 됩니다.

class AddressBook

{

    public List<Man> Mans { get; private set; }

 

    public void CreateMan(string name, string cellPhone = "None", string address="None")

    {

        Man man = new Man(name, cellPhone);

        this.Mans.Add(man);

    }

}

 

static void Main(string[] args)

{

    AddressBook addressBook = new AddressBook();

    addressBook.CreateMan("경찰서", "112");

    addressBook.CreateMan("소방서", "119");

    addressBook.CreateMan("우리집", "031", "경기도");

    addressBook.CreateMan("새로알게된사람", address: "경기도");

}

 

 

 

소스 : AboutOptionParam.zip

출처 : MSDN - C# 4.0

'.Net > C#' 카테고리의 다른 글

C# null조건 검사하지 않고 event 발생키시기  (0) 2013.07.30
C# Keys 열거형  (0) 2013.07.11
C# CMD 창 띄우지 않고 명령어 실행하기  (0) 2012.12.26
유니코드표  (0) 2012.09.24
C# Excel 범위로 데이터들 가져오기  (0) 2012.08.30

익명 메서드를 통한 깔끔한 코딩~

 

 

Winform

        /// <summary>
        /// 관망 해석 중 Percent가 변경되면 발생합니다.
        /// </summary>
        /// <param name="value"></param>
        void global_PecentageChangedEvent(int value)
        {
            this.Invoke(new MethodInvoker(
                delegate()
                {
                    this.ts_proBar.Value = value;
                }
            )
            );
        }

        /// <summary>
        /// 관망 해석 시작 전 Percent 최소 최대값을 Callback 받습니다.
        /// </summary>
        /// <param name="min"></param>
        /// <param name="max"></param>
        void global_InitProgressBarCallback(int min, int max)
        {
            this.Invoke(new MethodInvoker(
                delegate()
                {
                    this.ts_proBar.Minimum = min;
                    this.ts_proBar.Maximum = max;
                }
            )
            );
        }


 

 

 WPF

        private void btnTest1_Click(object sender, RoutedEventArgs e)
        {
            Thread thread = new Thread(UpdateButton);
            thread.Start();
        }
        public void UpdateButton()
        {
            if (this.btnTest2.Dispatcher.CheckAccess())
            {
                this.btnTest2.Content = "hi";
            }
            else
            {
                this.btnTest2.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                    (Action)delegate() { UpdateButton(); });
            }
        }


 

네이버지식인알리미

키워드 기능이 추가하였습니다.

 

테스트를 충분히 거치지 않아서

불안정한 감이 있습니다 T-T

 

기존 버젼과 사용법은 동일하되

분야를 추가 할 때 키워드를 추가 하실 수 있습니다.

( 네이버지식인알리미1.2 버젼은

 2013년 1월 7일까지 사용하 실 수있습니다.

안정화 작업 진행 후 다시 포스팅하겠습니다..)

 

네이버 지식인 알리미 v1.0.0.2 포스팅 바로가기

 

 

 

네이버지식인알리미_Setup_v1.2.0.0.exe

 

 

 

 

 

키워드 입력 버튼을 클릭하시면 [이미지 2]의 화면이 뜨게됩니다.

 

[이미지 1] 분야 추가 화면

 

 

 

 

 

 

 

키워드를 추가하는 방법은 아래와 같이

키워드 입력 후 Enter 키를 입력하시면 되겠습니다.

 

[이미지 2] 키워드 추가 화면

 

 

 

 

 

 

지식글 제목에 키워드가 포함되어 있으면

답변이 등록되었다는 메세지를 받으 실 수 있습니다.

 

[이미지 3] 키워드가 추가된 화면

 

 

 

 

'프로그램 > 네이버지식인알리미' 카테고리의 다른 글

네이버 지식인 알리미 v1.0.0.2  (6) 2012.08.10

현재 회사 진행 중인 프로젝트 중에 Rectangle 영역의 색상을

반전 시키는 기능이 있습니다.

 

ControlPaint Class의 static 메서드인

FillReversibleRectangle을 사용하여 반전 효과를 얻었지만.........

 

아래와 같은 문제점이 있었습니다.

 

 

 

 

 

 

Form에 Draw되는게 아니라 화면에 Draw되는 문제점......T_T

Activated와 Deactive Event를 통해 해결하려 했지만

Focus가 없는 최상위 Form이 생기면.......GG........

 

그러는 도중 구글링 중에

WinAPI에 InvertRect 함수 발견....

 

시그니쳐는 다음과 같습니다.

BOOL WINAPI InvertRect( __in HDC hDC, __in CONST RECT *lprc);

 

 

C#에서 사용하기 위해

Rect 구조체를 마이그레이션 하고

StructLayout 특성의 매개변수 LayoutKind.Sequential는 메모리를 순서대로 잡아주죠

Left->Top->Right->Bottom 이렇게..

 

아래의 LayoutKind.Explicit를 인자로 넘겨주게되면

멤버의 메모리 위치를 명시적으로 표시해주어야합니다.

        /// <summary>
        /// Rectangle
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct Rect
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
        /// <summary>
        /// Rectangle
        /// </summary>
        [StructLayout(LayoutKind.Explicit)]
        public struct Rect
        {
            [FieldOffset(0)]
            public int Left;
            [FieldOffset(4)]
            public int Top;
            [FieldOffset(8)]
            public int Right;
            [FieldOffset(12)]
            public int Bottom;
        }



 

 

API 함수를 호출 하기 위해 메서드를 정의하였습니다.

        /// <summary>
        /// 해당 Rectangle영역의 색상을 반전
        /// </summary>
        /// <param name="hdc"></param>
        /// <param name="lpRect"></param>
        /// <returns></returns>
        [DllImport("user32")]
        public static extern bool InvertRect(IntPtr hdc, ref Rect lpRect);


 

 

아래와 같이 코드를 작성하여서

프로그램에 적용 완료하였습니다. 

        /// <summary>
        /// Highlight를 생성할때 발생합니다
        /// </summary>
        /// <param name="rect"></param>
        void DrawManager_HighlightEvent(Rectangle rect)
        {
            try
            {
                if (rect == Rectangle.Empty)
                    return;
                using (Graphics g = this.panel_drawPaper.CreateGraphics())
                {
                    Websolus.NativeFunction.NativeGDI.Rect r = new Websolus.NativeFunction.NativeGDI.Rect();
                    r.Left = rect.Left;
                    r.Right = rect.Right;
                    r.Bottom = rect.Bottom;
                    r.Top = rect.Top;
                    Websolus.NativeFunction.NativeGDI.InvertRect(g.GetHdc(), ref r);
                }
            }
            catch (Exception ex)
            {
                MessageManager.ShowDetailErrorMessge(ex);
            }
        }


 

 

 

 

InnoSetup을 이용하다가 이번에는 Visual Studio 2010의

설치 프로젝트를 이용해 Setup파일을 작성하였습니다.

쉽게 Setup 파일을 만들 수 있습니다.

 

우선 새 프로젝트->설치 프로젝트를 추가합니다.

 

 

[이미지 1] 설치 프로젝트 추가

 

 

 

 

솔루션 탐색기에서 프로젝트 오른쪽 마우스 클릭하시고

추가->프로젝트 출력 클릭하셔서 기본 출력을 선택합니다.

(사용한 라이브러리는 자동으로 추가됩니다.

단, 참조에서 추가하지 않은 래퍼 클래스를 통해 사용한 라이브러리는 추가되지 않으므로

솔루션에 추가하시고 해당 파일의 속성에서 출력 디렉터리로 복사를 설정 하시고

프로젝트 출력 그룹 중에 콘텐츠 파일을 추가하시면 됩니다.)

 

 [이미지 2] 프로젝트 출력 그룹 추가

 

 

 

 

 

 

바탕화면사용자 프로그램 메뉴에 실행파일의 바로가기를

생성하기 위해 컴파일된 실행 파일을 추가 한후 바로가기를 만듭니다.

 

 

 [이미지 3] 바로가기 파일 추가

 

 

 

 

 

 

 

 

생성한 바로가기 파일은 드래그 하여 이동시킵니다.

(아이콘은 재설정해야 합니다.)

 [이미지 4] 바로가기 파일 이동

 

 

이와같이 설정을 하시고 설치 프로젝트를 빌드 하시게되면

msi 파일과 exe파일을 얻으실 수 있습니다.

 

 

 

 

다음은 추가로 Uninstall하기 위한 작업에 대해 설명하겠습니다.

ProductCode를 이용해 Uninstall을 할 수 있습니다.

프로젝트 속성에서 Product Code를 확인 하실 수 있습니다.

 

[이미지 5] Uninstall을 하기위해 ProductCode 확인

 

 

 

 

 

 

 

배치파일을 생성하였습니다.

txt로 작성 한 후 확장자만 *.bat로 변경해주시면 됩니다.

명령어는 위에서 확인한 Product Code를 이용해 작성합니다.

 /msiexec /x {PRODUCT CODE}

 

[이미지  6] 배치파일 생성

 

 

 

[이미지 7] 배치파일의 내용

 

 

 

 

 

 

 

 

 

배치파일의 바로가기를 생성하여 Uninstall 바로가기 클릭시 배치파일을 실행하게하면

자동으로 Uninstall이 진행됩니다.

배치 파일을 실행하게되면 CMD 창이 활성화 되는데

저는 그게 싫어서 따로 프로그램으로 작성하여서 Uninstall 프로그램을 사용하고 있습니다.

코드는 아래의 링크를 통해 확인 하실 수 있습니다.

 

C# CMD 창 띄우지 않고 명령어 실행하기 바로가기

 

static void Main(string[] args) { ProcessStartInfo cmdProcess = new ProcessStartInfo(); cmdProcess.WindowStyle = ProcessWindowStyle.Hidden; cmdProcess.CreateNoWindow = true; cmdProcess.FileName = "cmd"; cmdProcess.Arguments = "/c msiexec /x "; //Product ID cmdProcess.Arguments += "{731962DB-76B1-XXE8-XXA7-3XX57C9F6EXX}"; Process pro = new Process(); pro.StartInfo = cmdProcess; pro.Start(); }


 

 

[이미지 1] CMD Help

'.Net > C#' 카테고리의 다른 글

C# Keys 열거형  (0) 2013.07.11
C# 4.0 선택적 매개변수, 명명된 매개변수  (0) 2013.01.10
유니코드표  (0) 2012.09.24
C# Excel 범위로 데이터들 가져오기  (0) 2012.08.30
C# Serialize, Deserialize  (0) 2012.08.21

+ Recent posts