Program Database의 약자로 디버그와 프로젝트 상태 정보를 보유하고 있는 파일이다.

Visual Studio에서 프로젝트 작성 시, MyDocument에 있는 경우 PC의 유저명이 유출될 수 있다.

디버그 시에는 이 파일로 브레이크 포인트를 걸 수 있어 유효하지만, 릴리즈 시에는 필요가 없다.

 

Visual Studio의 프로젝트 프로퍼티의 빌드설정에서 디버그 정보인 pdb파일을 출력하지 않게 설정할 수 있다.

 

출처 : https://qiita.com/lainzero/items/27681ddc96638e33758b

 

반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
LINQ  (0) 2021.02.14
비동기처리1 - Thread, Task  (0) 2021.01.07
DLL이란?  (0) 2020.12.09

■개요

LINQ(Language INtergrated Query : 통합 언어 쿼리)는 복수의 데이터에서 조건에 맞는 데이터를 간추린 데이터들을 얻을 수 있도록 해주는 C#의 문법으로, .Net Framework 3.5부터 도입되었다고 한다.

 

■샘플코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWorldCore
{
    /// <summary>
    /// 학생 클래스
    /// </summary>
    class Student
    {
        public string name { get; set; }
        public int age { get; set; }
        public int grade { get; set; }
    }

    /// <summary>
    /// Linq 사용법
    /// </summary>
    class LinqPractice
    {
        private int studentNumber = 5;
        private string[] studentNames = { "홍길동", "황진이", "이순신", "장영실", "정약용" };
        private int[] studentAges = { 25, 26, 25, 30, 40 };
        private int[] studentGrades = { 4, 4, 4, 2, 1 };

        // 학생 리스트
        List<Student> students = new List<Student>();

        public LinqPractice()
        {
            CreateStudents();
        }
        private void CreateStudents()
        {
            // 학생 객체를 생성하여 학생 리스트에 추가한다.
            for (int i = 0; i < studentNumber; i++)
            {
                Student student = new Student();
                student.name = studentNames[i];
                student.age = studentAges[i];
                student.grade = studentGrades[i];

                students.Add(student);
            }
        }

        /// <summary>
        /// LINQ구문은 from ~ where ~ select 순서로 작성한다.
        /// LIST, DataSource, Database, Collection, Array등을 LINQ로 사용할 수 있다.
        /// from, where, order by, select, group by, join등의 구문을 사용할 수 있다.
        /// </summary>
        public void TestLinq()
        {
            // 20대 학생만을 조회하여 얻어오는 Linq구문
            var Twenty_Student = from _student in students
                                 where _student.age >= 20 && _student.age < 30
                                 orderby _student.age ascending
                                 select _student;

            // 30대 학생만을 조회하여 얻어오는 Linq구문
            var Thirty_Student = from _student in students
                                 where _student.age >= 30 && _student.age < 40
                                 orderby _student.age ascending
                                 select _student;

            foreach(var Student in Twenty_Student)
            {
                Console.WriteLine("20대 학생은 = {0} 입니다.", Student.name);
            }

            Console.WriteLine();

            foreach (var Student in Thirty_Student)
            {
                Console.WriteLine("30대 학생은 = {0} 입니다.", Student.name);
            }
        }
    }
}

 

 

■참조

afsdzvcx123.tistory.com/entry/C-LINQ-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[C#] LINQ 소개 및 사용법

이번 포스팅에서는 C# 문법 중 하나인, LINQ에 대해 알아보도록 하겠습니다. LINQ란 Language-Intergreated Query의 약자?로써, .NET Framework 버전 3.5부터 도입이 되었습니다. 그냥 쉽게 간단히 얘기해 C#에서..

afsdzvcx123.tistory.com

 

반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
pdb 파일  (0) 2021.03.15
비동기처리1 - Thread, Task  (0) 2021.01.07
DLL이란?  (0) 2020.12.09

■ 동기 처리란?

앞 처리의 결과가 반환돼야 다음 처리로 넘어가는 것

ex) 요리하기

 

■ 비동기 처리란?

앞 처리의 결과를 기다리지 않고 다음 처리로 넘어가는 것

ex) 요리하면서 욕실에 물 받기

 

■ 비동기 처리의 종류

Thread, Task, async, await

 

■ 옛 방식의 비동기 처리 「Thread」

아래는 메인 스레드에서는 HeavyMethod2를, 다른 별도의 스레드에서 HeavyMethod1를 비동기로 실행하는 소스이다.

Program
{
    static void Main(String[] args)
    {
    	Thread thread = new Thread(new ThreadStart(() =>
        {
        	HeavyMethod1();
        }));
        
        thread.Start();
        
        HeavyMethod2();
        
        Console.ReadLine();
    }
    
    static void HeavyMethod1()
    {
    	Console.WriteLine("매우 무거운 처리1 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리1 종료");
    }
    
    static void HeavyMethod2()
    {
    	Console.WriteLine("매우 무거운 처리2 시작");
        Thread.Sleep(3000);
        Console.WriteLine("매우 무거운 처리2 종료");
    }
}

결과

매우 무거운 처리2 시작
매우 무거운 처리1 시작
매우 무거운 처리2 종료
매우 무거운 처리1 종료

■ 비동기 처리 「Task」

Task는 Thread에서는 할 수 없는, 다음 세 가지를 실현할 수 있다.

- 비동기로 실시한 처리의 상태(실행중, 완료, 취소, 에러)를 알 수 있다.

- 예외를 보충(처리 할 수 있다는 말인가?)할 수 있다.

- 비동기 처리의 실행순서를 제어할 수 있다.

Program
{
    static void Main(string[] args)
    {
    	// Task를 생성한다.
        // Task.Run메소드는 Task를 생성하는 Factory 클래스로, Task형의 객체를 반환한다.
        // 인수에는 delegate를 전달한다.
        // 단순히 HeavyMethod1을 실행하고 싶은 경우, 인수가 없는 delegate를 전달한다.
        Task task = Task.Run(() => {
        	HeavyMethod1();
        });
        
        HeavyMethod2();
        
        Console.ReadLine();
    }
    
    static void HeavyMethod1()
    {
    	Console.WriteLine("매우 무거운 처리1 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리1 종료");
    }
    
    static void HeavyMethod2()
    {
    	Console.WriteLine("매우 무거운 처리2 시작");
        Thread.Sleep(3000);
        Console.WriteLine("매우 무거운 처리2 종료");
    }
}

결과

매우 무거운 처리2 시작
매우 무거운 처리1 시작
매우 무거운 처리2 종료
매우 무거운 처리1 종료

■ Thread와 Task 비교 ~1~ 「결과값을 취득하고 싶을 때」

・Thread의 경우

Program
{
    static void Main(string[] args)
    {
    	// 메인 스레드에서 접근할 수 있는 변수를 정의하고 이 곳에 결과를 저장한다.
        string result = "";
        
        Thread thread = new Thread(new ThreadStart(() =>
        {
            // 메인스레드와 다른 스레드로 HeavyMethod를 실행하여,
            // 결과(이러쿵저러쿵)을 result에 저장한다.
            result = HeavyMethod();
        }));
        
        // 스레드를 시작한다.
        thread.Start();
        
        // Join 메소드를 사용하면 스레드가 종료할 때까지 다음 처리를 실행하지 않는다.
        thread.Join();
        
        // 결과를 콘솔에 표시한다.
        Console.WriteLine(result);
        
        Console.ReadLine();
    }
    
    static string HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thrad.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
        
        return "이러쿵저러쿵";
    }
}

결과

매우 무거운 처리 시작
매우 무거운 처리 종료
이러쿵저러쿵

・Task의 경우

Program
{
    static void Main(string[] args)
    {
    	// 결과를 취득하는 경우 Task를 Generic 타입으로 정의하여 그 Generic에 반환값의 타입을 지정한다.
        Task<string> task = Task.Run(() =>
        {
            return HeavyMethod();
        });
        
        // 결과를 취득한다.
        // Result의 속성을 사용하면 Task에서 지정한 HeavyMethod가 종료할 때까지 대기하며,
        // 결과를 result 변수에 대입해준다.
        string result = task.Result;
        
        // 결과를 콘솔에 표시한다.
        Console.WriteLine(result);
        
        Console.ReadLine();
    }
    
    static string HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thrad.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
        
        return "이러쿵저러쿵";
    }
}

결과

매우 무거운 처리 시작
매우 무거운 처리 종료
이러쿵저러쿵

Task의 Result 속성을 사용하면, Thread에 비해 직관적이고 간단하게 결과값을 얻을 수 있다.

Result 속성의 사용으로 Thread에서 수행하던 다음 2가지 처리를 하지 않아도 된다.

- 메인스레드에 result 변수를 미리 정의하는 것

- 스레드가 종료할 때까지 Join 메소드로 대기하는 것

→ Task는 개발자가 스레드를 의식하지 않고 동기 처리같은 코드로 비동기 처리를 실현하게 해준다.

 

■ Thread와 Task 비교 ~2~ 「예외를 보충하고 싶을 때」

・Thread의 경우

 

Program
{
    static void Main(string[] args)
    {
    	try {
            Thread thread = new Thread(new ThreadStart(() =>
            {
            	throw new Exception("받아줘 >_<");
                HeavyMethod();
            }));
            
            thread.Start();
            
        } catch (Exception e) {
            Console.WriteLine("받아줘~ Catch!!")
        }
        
        Console.WriteLine("종료");
        
        Console.ReadLine();
    }
    
    static void HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
    }
}

결과

종료

스레드 안의 예외를 처리하지 않는다.

 

・Task의 경우

Program
{
    static void Main(string[] args)
    {
        Task task = Task.Factory.StartNew(() => {
            throw new Exception("받아줘 >_<");
            HeavyMethod();
        });
        
    	try {
            // 예외를 캐치하는 경우, Wait 메소드를 실시하는 부분을 try...catch로 감싼다.
            // 예외가 발생하면 AggregateException에 Wrap되어 Throw된다.
            task.Wait();
        } catch (Exception e) {
            Console.WriteLine("받아줘~ Catch!!")
        }
        
        Console.WriteLine("종료");
        
        Console.ReadLine();
    }
    
    static void HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
    }
}

결과

받아줘~ Catch!!
종료

스레드 안에서 발생한 예외를 메인스레드가 제대로 캐치했다.

여기서도 마찬가지로 스레드를 의식하지 않고 동기적인 코드로 예외를 캐치했다.

 

■ Thread와 Task 비교 ~3~ 「다수 스레드의 종료를 기다리고 싶을 때」

케이스 : 정수 1을 반환하는 HeavyMethod1과 정수 2를 반환하는 HeavyMethod2를 병행 실행하여

그 결과를 더해서 콘솔에 3을 출력

・Task의 경우

Program
{
    static void Main(string[] args)
    {
        // 정수 1을 반환하는 HeavyMethod1의 Task를 생성한다.
        Task<int> task1 = Task.Run(() => {
            return HeavyMethod1();
        });
        
        // 정수 2를 반환하는 HeavyMethod2의 Task를 생성한다.
        Task<int> task2 = Task.Run(() => {
            return HeavyMethod2();
        });
        
        // WhenAll의 인수로 생성한 Task를 지정하면 HeavyMethod1, HeavyMethod2가 종료할 때까지
        // 다음 코드를 실행하지 않는다. 즉, 대기한다.
        Task.WhenAll(task1, task2);
        
        Console.WriteLine(task1.Result + task2.Result);
        
        Console.ReadLine();
    }
    
    static int HeavyMethod1()
    {
        Console.WriteLine("매우 무거운 처리1 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리1 시작");
        
        return 1;
    }
    
    static int HeavyMethod2()
    {
        Console.WriteLine("매우 무거운 처리2 시작");
        Thread.Sleep(3000);
        Console.WriteLine("매우 무거운 처리2 시작");
        
        return 2;
    }
}

결과

매우 무거운 처리2 시작
매우 무거운 처리1 시작
매우 무거운 처리2 종료
매우 무거운 처리1 종료
3

■ 정리

Task를 사용하면 Thread로 하던 처리를 매우 심플하게 작성할 수 있다.

 

출처 : https://tech-lab.sios.jp/archives/15637 

 

多分わかりやすいC#の非同期処理その1 〜 ThreadとTask 〜 | SIOS Tech. Lab

こんにちは、サイオステクノロジー技術部 武井(Twitter:@noriyukitakei)です。今回は、C#を学び始めた人たちが一番始めに当たる関門であろう非同期処理ついて解説したいと思います。2回シリー

tech-lab.sios.jp

 

반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
pdb 파일  (0) 2021.03.15
LINQ  (0) 2021.02.14
DLL이란?  (0) 2020.12.09
프로젝트에서 소스코드가 없는 기존의 exe 프로그램을 새로 만들어야 하는 상황이 생겼다.
기존 프로그램의 소스코드를 알기 위해 디컴파일이라는 개념에 대해 조사했다.
 
정의
컴파일과는 반대로, 컴파일된 실행 파일을 소스코드로 되돌리는 작업이다.
리버스 엔지니어링이라고도 불린다.
디컴파일을 이해하기 위해서는 컴파일 과정에 대한 이해가 필요하다.
 
C#(혹은 VB.NET)의 컴파일 과정

C#이나 JAVA는 소스코드를 바이트코드(중간언어)로 컴파일한 후, 이를 기계어로 변환한다.
C#에서는 바이트코드를 IL(Intermediate Langauge)라고 부르며, JAVA에서는 Class파일이라 부른다.
 
바이트코드의 역어셈블

아래와 같은 경로에 있는 VisualStudio의 부속 실행파일인 ildasm.exe을 사용하면 바이트코드를 역어셈블하여 사람이 알 수 있도록 보여준다.
 
디컴파일러를 사용한 바이트코드의 소스코드화
.NET Reflector, dotPeek, ILSpy 등 디컴파일러를 사용하면 소스코드를 디컴파일 하지 못하도록 난독화를 하지 않은 이상,
실행파일을 디컴파일하여 소스코드를 볼 수 있다.
 
반응형
정의
인터넷 트래픽을 암호화하고 온라인 ID를 보호하는 가상 사설망으로, 전 세계 어디서나
App과 WebSite, Entertainment Platform에 안전하게 액세스할 수 있게 해준다.
 
특징
  • 사용자의 IP가 VPN의 IP로 변경된다. (ex 192.168.X.X => 218.157.X.X)
  • (디바이스 -> 인터넷 -> VPN -> 인터넷) 순으로 데이터가 암호화되어 전송된다.
  • 외부에서나 VPN 제공 업체에서도 사용자의 데이터를 확인할 수 없다.
  • 암호화 통신을 수행하기 때문에 통신 속도가 저하된다.
 
왜 필요한가?
감시와 추적으로부터 자유로워지기 위해 개인정보 보호를 강화한다.
[사용 예]
  • 공공 Wi-Fi를 사용하는 경우
    • 해커는 공공 핫스팟에서 데이터를 훔칠 수 있으므로, VPN을 이용하면 Wi-Fi상에서 완전한 보안을 유지해준다.
  • 차단된 웹 사이트에 접속하는 경우
    • VPN은 IP주소를 변경하고 원격 서버를 통해 인터넷 연결을 리디렉션 하여 차단을 우회할 수 있다.
  • 데이터를 암호화하는 경우
    • VPN 암호화는 사용자의 인터넷 트래픽을 보호, 온라인에 흔적을 안남게 한다.
    • ISP 업체가 사용자의 검색 기록을 최고 입찰자에게 팔 수 없다.
  • 정부 감시를 피하고 싶은 경우
    • 정부 기관은 인터넷 사용자의 개인 정보를 추적, 수집하고 국경을 넘어 공유하기도 한다.
    • VPN은 트래픽과 사용자의 IP와 위치를 숨기고 암호화하여 이러한 감시활동을 저지할 수 있다.
  • 사용자가 자신의 위치를 숨기고 싶은 경우
    • VPN은 민감한 메시지에 대한 추가적인 보안을 제공한다.
  • 파일 공유 서비스를 사용할 경우
    • 많은 ISP 업체들이 대역폭 제한을 설정하여 사용자의 P2P 파일 공유를 제한한다.
    • VPN은 ISP 업체가 사용자의 파일 공유 여부를 탐지, 추적하기 어렵게 한다.
 
VPN 작동 원리
VPN 서비스에 연결하면 인터넷을 통해 암호화된 "터널"이 생성된다.
이를 이용해 검색 엔진에서 온라인 뱅킹 계정에 이르기까지 사용자와 목적지 간에 데이터가 안전하게 보호된다.

이 터널은 먼저 VPN  서버로 클라이언트를 인증하여 생성된다.
그 후 서버는 주고받는 모든 데이터에 암호화 프로토콜을 적용한다.
각 데이터 패킷이 안전하게 유지되도록, VPN은 외부 패킷에 해당 패킷을 래핑한 다음, 캡슐화를 통해 암호화 한다.
데이터가 서버에 도착하면 암호해독 프로세스를 통해 외부 패킷이 제거된다.
 
대표적 VPN 암호화 프로토콜 3가지
  • OpenVPN
    • TCP/UDP 모두 사용할 수 있어 속도와 보안이 균형있게 제공된다.
  • IKEv2/IPSec
    • 인터넷이 끊긴 후 보안 연결을 복원할 수 있다.
    • 변화하는 네트워크에 잘 적응하여 가정용 Wi-Fi와 모바일 연결을 자주 전환하거나 핫스팟을 자주 사용하는 사용자에게 좋다.
  • NordLynx
    • 적은 코드로 작성되어 빠르고 오류가 적다.
    • 배포 및 감사가 매우 쉬워 즉시 버그를 찾아 대응할 수 있다.
 

 

반응형

'■ 웹 개발 > 네트워크' 카테고리의 다른 글

네트워크 개요  (0) 2021.04.13
직렬(Serial) 통신이란?  (0) 2020.12.08
소켓(Socket) 통신이란?  (0) 2020.12.08
포트(Port)란?  (1) 2020.12.08
정의
DDL(Dynamic Link Library)를 이해하기 위해서는, Library의 의미와 Static Link, Dynamic Link의 차이를 이해해야 한다.
 
Library란?
간단한 코드(함수, 데이터 타입)를 재사용 가능하도록 모듈화한 것이다.
 
Static Link와 Dynamic Link의 차이점
라이브러리를 언제 메인 프로그램에 연결하느냐에 따라 구분된다.
  • 정적 링크(Static Link)
    • 컴파일 시점에 라이브러리가 링크에 의해 연결되어 실행 파일의 일부분이 된다.

  • 동적 링크(Dynamic Link)
    • 실행 파일에서 해당 라이브러리의 기능을 사용 시에만 라이브러리를 참조(혹 다운로드)하여 기능을 호출한다.
    • 프로그램 실행 시 DLL도 함께 메모리 공간으로 읽어와 내부 함수처럼 호출한다.
    • 필요한 시점에 메모리로 읽어오고 불필요하면 메모리에서 내릴 수 있다.

 
DLL의 이점
  • 적은 리소스
    • 한 코드를 여러 프로그램에서 사용하기 때문에 메모리가 절약된다.
    • 사용되는 디스크 공간을 줄일 수 있다.(정적 링크는 실행 파일에 라이브러리의 함수가 모두 포함되어 실행 파일 크기가 커진다.)
    • 운영체제와 프로그램이 더 빠르게 로드 및 실행된다.
  • 모듈식 아키텍쳐
    • 실행 파일은 DLL에 있는 함수를 Import, DLL은 실행파일에게 함수를 Export하는 것과 다름 없다.
    • Export할 함수에 대한 정보가 DLL에 기록되어 있어야 한다.
  • 손쉬운 배포 및 설치
    • DLL 하나만 업데이트해도 모든 프로그램에 그 내용이 적용된다.
  • 프로그래머의 분업이 용이하고 뛰어난 재사용성을 보유
    • 코드의 양이 적어지므로 디버깅이 용이하다.
 
DLL 사용상의 유의점
  • 프로그램이 DLL을 사용할 때 종속성*이라는 문제로 프로그램이 실행되지 않을 수 있다.
  • DLL은 해로운 파일일 수도 있기 때문에 신뢰할 수 있는지 확인해야 한다.
  • DLL 파일을 함부로 이동시키면 프로그램이 정상적으로 작동하지 않을 수 있다.
 
* DLL 종속성이란?
프로그램 혹은 DLL이 다른 DLL의 함수를 사용하는 경우 종속성이 작성된다.
이런 경우 해당 프로그램은 더 이상 자체 포함 프로그램이 아니며, 종속성이 손상되면 프로그램에 문제가 발생할 수 있다.
아래 예의 경우를 DLL 충돌이라 하며, 호환성이 적용되지 않으면 프로그램이 정상적으로 실행되지 않을 수 있다.
ex1) 종속 DLL을 새 버전으로 업그레이드하는 경우
ex2) 종속 DLL을 수정하는 경우
ex3) 종속 DLL을 이전 버전으로 덮어쓰는 경우
ex4) 종속 DLL을 제거하는 경우
 
출처 :
반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
pdb 파일  (0) 2021.03.15
LINQ  (0) 2021.02.14
비동기처리1 - Thread, Task  (0) 2021.01.07

+ Recent posts