728x90
반응형
SMALL
728x90
반응형
LIST
728x90
반응형
SMALL
Json파일을 문자열로 조합하여 잘 사용하고 있었는데, 어느 순간 역슬래쉬가 들어오면서 에러가 발생하였다.
Json문자열에 이런 특정 문자가 들어왔을 때,
즉, Json파일에 오류가 생기게 하는 문자를 처리하는 방법을 알아보도록 하자.

 

■ Json 파일 만드는 법

1. 직접 문자열 조립

- 데이터에 역슬래시(\), 따옴표("), 개행(\n), 탭(\t) 등이 들어 있으면 JSON 문법상 이스케이프 처리가 안 되어 있어 오류

string json = $"{{\"NAME\":\"좌표\", \"X\":{100}, \"Y\":{100}}}";

json = JsonConvert.DeserializeObject(json).ToString();     # Newtonsoft.Json 패키지 설치 필요

 

# 변수 json 출력

{

     "NAME": "좌표",

     "X": 100,

     "Y": 100

}

 

2. JsonSerializer로 생성 (System.Text.Json 사용)

  - System.Text.Json.JsonSerializer 가 내부적으로 모든 문자를 안전하게 이스케이프 처리

var options = new JsonSerializerOptions

{

     Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,

     WriteIndented = true

};

 

var data = new

{

     NAME = "좌표",

     X = 100,

     Y = 100

};

 

string json = JsonSerializer.Serialize(data, options);

 

# 변수 json 출력

{

     "NAME": "좌표",

     "X": 100,

     "Y": 100

}

 

3. 결론은 직접 문자열 조립은 위험하므로, 이스케이프 처리가 되는 JsonSerializer를 사용한다.

728x90
반응형
LIST
728x90
반응형
SMALL
C#으로 프로그램을 만들 때 Font를 Custom Font를 사용하면,
사용자 PC에 Custom Font가 없는 경우가 있을 수 있다.
이런 경우는 Font는 기본 Font가 적용되어, Custom Font를 사용한 의미가 없어진다.
이를 위해서는 사용자가 프로그램을 실행할 때, 자동으로 Custom Font를 설치가 되어야 한다.
그럼 Custom Font를 자동으로 설치하는 로직을 알아보도록 하자.

 

■ Font를 자동으로 설치하는 방법

1. 제일 먼저 실행되는 프로젝트 파일에 로직을 넣는다.

  - 예) FontProject라는 프로젝트 Program.cs 파일에 로직을 넣는다.

  - 초기화면은 아래와 같다. (다 똑같지는 않음)

# Program.cs

namespace FontProject

{

     internal static class Program

     {

           /// <summary>

           ///   The main entry point for the application.

           /// </summary>

           [STAThread]

           static void Main()

           {

                 // To customize application configuration such as set high DPI settings or default font,

                 // see https://aka.ms/applicationconfiguration.

                 ApplicationConfiguration.Initialize();

 

                 // Custom Font를 설치한다. 경로는 Custom Font 파일이 있는 모아둔 폴더로 지정             

                 // 이 부분은 추가해야 한다!

                 CustomFontInstall.InstallFontsFromFolder(@"C:\Font");                 

 

                 Application.Run(new Form1());

           }

     }

}

 

2. Program.cs에서는 호출만 할 것이기 때문에, Font와 관련된 Class파일을 만든다.

# CustomFontInstall.cs

using Microsoft.Win32;

using System.Drawing.Text;

using System.Runtime.InteropServices;

 

namespace FontProject

{

     public static class CustomFontInstall

     {

           [DllImport("gdi32.dll")]

           private static extern int AddFontResource(string lpFilename);

 

           [DllImport("user32.dll")]

           private static extern bool SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

 

           private const int WM_FONTCHANGE = 0x001D;

 

           public static void InstallFontsFromFolder(string pSourceFolder)

           {

                string sFontPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts";

                string sFontsFolder = Environment.GetFolderPath(Environment.SpecialFolder.Fonts);

 

                // Windows에서 Font 설치 정보를 관리하는 레지스트리 경로

                RegistryKey regFontRegKey = Registry.LocalMachine.OpenSubKey(sFontPath, false);

 

                foreach (string file in Directory.GetFiles(pSourceFolder, "*.ttf"))

                {

                     string sFontFileName = Path.GetFileName(file);

                     string sFontDestPath = Path.Combine(sFontsFolder, sFontFileName);

                     string sFontDisplayName = GetFontDisplayName(file);

 

                     // 파일 Font이름은 같을 수 있기 때문에, 내부 Font이름을 가져온다. - Font설치 Skip방지를 위해서 자세하게 비교

                     string sFontStyleName = Path.GetFileNameWithoutExtension(file);                

 

                     if (string.IsNullOrWhiteSpace(sFontDisplayName))

                     {

                          // 폰트이름을 가지고 올 수 없음. 여기 로직은 알아서 처리. (나는 로그 남기고 Continue 시킴, 나머지라도 설치)   

                     }

 

                     string sRegistryFontName = $"{sFontDisplayName} ({sFontStyleName}) (TrueType)";

                     bool isAlreadyInstalled = regFontRegKey.GetValue(sRegistryFontName) != null;

 

                     // 이미 설치된 Font는 Skip

                     if (isAlreadyInstalled || File.Exists(sFontDestPath))

                          continue;

 

                     try

                     {

                          File.Copy(file, sFontDestPath);

 

                          // 레지스트리 등록

                          using (RegistryKey regWrite = Registry.LocalMachine.OpenSubKey(sFontPath, true))

                          {

                               regWrite.SetValue(sRegistryFontName, sFontFileName);

                          }

 

                          AddFontResource(sFontDestPath);

 

                          // 시스템 전체에 Font가 변경되었다는 것을 알림 - 이것을 안 하면 재부팅될 때까지 Font가 안 나올 수 있음

                          SendMessage((IntPtr)0xFFFF, WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);

                     }

                     catch (Exception ex)

                     {

                          // 설치 실패

                     }

                }

           }

 

           private static string GetFontDisplayName(string pFontPath)

           {

                try

                {

                     using (PrivateFontCollection pfc = new PrivateFontCollection())

                     {

                          pfc.AddFontFile(pFontPath);

                          pfc.AddFontFile(pFontPath);

 

                          if (pfc.Families.Length > 0)

                               return pfc.Families[0].Name;

                     }

                }

                catch

                {

                     // 에러가 나도 그냥 실행하기 위해서

                }

             

                return null;   

           }

     }

}

 

3. 이렇게 하고 프로그램을 실행하면 Custom Font가 설치된 것을 확인할 수 있다.

4. Custom Font가 적용되지 않으면, app.manifest파일을 만들어 관리자 권한으로 실행할 수 있도록 한다.

728x90
반응형
LIST
728x90
반응형
SMALL

■ C#에서 WinSCP를 이용하여 sFTP를 접속하는 방법

1. 인터넷에서 WinSCP를 다운로드한다. (https://winscp.net/eng/download.php)

 

2. 접속하면 아래 이미지와 같이 나오는데 사각형 부분을 눌러 설치한다.

 

3. 설치된 경로에 가서 WinSCP.exe, WinSCPnet.dll를 복사한다. 그리고 C#으로 만든 프로그램 실행파일 위치로 옮겨준다.

    실행하는 데 있어, 따로 dll을 모아놓은 곳이 있으면 그쪽으로 옮겨준다. (사용자들이 프로그램 만든 구조에 따라 위치가 다름)

 

4. 아래와 같은 코드를 작성한다.

// 서버 접속

Session session = new Session();

SessionOptions session_options = new SessionOptions();

 

session.ExecutablePath = @"D:\WinSCP.exe";               // WinSCP.exe 가 있는 경로

 

session_options.Protocol = Protocol.Sftp;

session_options.HostName = Host;                                  // 서버의 Host 넣기

session_options.PortNumber = Port;                                // 서버의 Port 넣기

session_options.UserName = UserName;                         // 서버의 UserName 넣기

session_options.Password = Password;                            // 서버의 Password 넣기

session_options.SshHostKeyFingerprint = FingerPrint;    // 서버의 FingerPrint 넣기

 

session.Open(session_options);                                        // 접속 완료

 

session.GetFiles(서버파일경로, 로컬파일경로, false).Check();    // Download

session.PutFiles(로컬파일경로, 서버파일경로, false).Check();    // Upload

 

// Download 하지 않고, 이미지 바로 가져오는 방법

using (Stream remoteStream = session.GetFile(RemoteFullPath))    // RemoteFullPath : 이미지 파일이 있는 경로

using (MemoryStream ms = new MemoryStream())

{

    remoteStream.CopyTo(ms);

    ms.Position = 0;

 

    Image imgReturn = Image.FromStream(ms);

}

728x90
반응형
LIST
728x90
반응형
SMALL

■ Visual Studio 주요 버전 타임라인

Visual Studio 버전 출시일 주요 특징 / 지원 언어
VS 2002 (.NET 1.0) 2002.02 최초의 .NET 통합 개발환경
VS 2003 (.NET 1.1) 2003.04 안정화 및 성능 개선
VS 2005 (.NET 2.0, C# 2.0) 2005.11 제네릭, 익명 메서드 등
VS 2008 (.NET 3.5, C# 3.0) 2007.11 LINQ, 자동 프로퍼티
VS 2010 (.NET 4.0, C# 4.0) 2010.04 dynamic, optional 파라미터
VS 2012 (.NET 4.5, C# 5.0) 2012.08 async/await 도입
VS 2013 (.NET 4.5.1, C# 5.0) 2013.10 UI 개선, Roslyn 베타 시작
VS 2015 (.NET 4.6, C# 6.0) 2015.07 nameof, string interpolation
VS 2017 (.NET Core 지원 시작, C# 7.x) 2017.03 Tuples, pattern matching
VS 2019 (.NET Core 3.1, C# 8.0) 2019.04 switch 개선, nullable reference
VS 2022 (.NET 6~8, C# 10~12) 2021.11 64비트 IDE, Hot Reload
VS 2022 17.9 (C# 13 프리뷰) 2024.03 .NET 9, C# 13 일부 기능 사용 가능
VS 2025 (예정) 2025.11 (예정) .NET 9 정식 대응, C# 13 완전 지원
728x90
반응형
LIST
728x90
반응형
SMALL
C#, Oracle을 사용한 프로그램을 만들면서 Oracle Connection에 대해 궁금점이 생겼다.
1. 최초 Connection을 한번 맺어놓고, 프로그램 종료 시 Connection을 끊는 경우
2. CRUD를 실행할 때마다 Connection/Disconnection을 하는 경우
두 가지 경우에 대해 장단점과 어떤 것을 요즘 많이 사용하는지도 알아보도록 하자.

 

■ 지속적인 Connection 유지 (Persistent/Open Connection)

1. 프로그램 시작 시 OracleConnection을 열고, 종료 시까지 계속 열어두는 방식이다.

2. 장점

  - 빠른 응답 속도: 매번 Connection을 열고 닫는 오버헤드가 없다.

  - 빈번한 DB 접근에 유리: 수많은 쿼리를 주기적으로 실행하는 경우 성능이 향상된다.

3. 단점

  - 자원 낭비: 사용하지 않는 시간에도 Connection이 유지되므로 DB 서버의 자원을 계속 점유하게 된다.

  - DB Connection Full 고갈 위험: 여러 클라이언트가 동시에 Connection을 유지하면 Connection Full이 부족해질 수 있고,

    그로 인해 접속자체가 안될 경우가 생긴다.

  - 에러 발생 시 복구 어려움: 중간에 네트워크나 DB 문제가 생기면 Connection이 죽고 전체 프로그램이 영향을 받을 수 있다.

  - 동시 작업 대응 시, 직렬 처리만 가능하다.

    즉, 하나의 커넥션은 한 번에 하나의 쿼리만 실행할 수 있으므로, 동시에 여러 쿼리를 해당 Connection에서 병렬로 실행할 수는 없다.

    이 말은 async/await를 사용하는 경우 동시에 병렬로 쿼리를 2개 실행하는 경우, InvalidOperationException에러가 발생할 수 있다.

 

■ 필요시 Connection 열고 작업 후 닫기 (Open on Demand)

1. CURD 할 때마다 Connection, Disconnection 한다.

2. 장점

  - 자원 효율적: Connection을 오래 점유하지 않기 때문에 서버 자원을 절약할 수 있다.

  - 안정성: 네트워크 문제가 있어도 Connection을 짧게 쓰기 때문에 문제가 생겨도 영향이 제한적이다.

  - 스케일 확장 유리: 다수의 사용자에게도 Connection Full이 효율적으로 배분된다.

3. 단점

  - 응답 속도 약간 느릴 수 있다. : 매번 Connection을 여닫기 때문에 약간의 오버헤드가 발생한다.

  - 빈번한 호출 시 성능 저하를 초래할 수 있다. : 짧은 시간에 수백 번 Connection을 열고 닫으면 오히려 비효율적이다.

 

■ 요즘의 트렌드

1. 필요시 Connection 열고 작업 후 닫기 (Open on Demand) + Connection Pooling을 많이 사용한다.

2. .NET의 OracleConnection은 자동으로 Connection Pooling을 사용하므로, Connection을 자주 열고 닫아도 실제 Connection은 재사용되기

    때문에, 지속적인 Connection 유지 (Persistent/Open Connection)와 성능 및 속도 차이는 크게 나지 않는다.

3. 단, 배치 처리나 실시간으로 수천 번 DB를 호출하는 특수 상황에서는 Connection을 열어두는 방식이 더 효율적일 수 있으므로,

    케이스에 따라 판단해야 한다.

728x90
반응형
LIST
728x90
반응형
SMALL

■ VS 2005 (.NET 2.0, C# 2.0)의 주요 특징

1. 제네릭

# 과거 방식

ArrayList list = new ArrayList();

list.Add("Alice");

string name = (string)list[0];    # 형변환 필요, 문자형 숫자형이 동시에 들어갔을 땐, 런타임 오류 가능성 있음


# 제네릭 도입 후

List<string> names = new List<string> { "Alice", "Bob" };

string name2 = names[0];    # 형변환 불필요, 타입 안전

 

2. 익명 메서드

# 과거 방식

delegate void Print(string msg);    # 델리게이트 선언

 

# 반드시 메서드를 선언해야 한다.

private void MyPrint(string msg)

{

    MessageBox.Show(msg);

}

 

# Form에 Button1을 올려놓고, 클릭 이벤트에서 호출한다고 하면..

private void Button1_Click(object sender, EventArgs e)

{

    Print print1 = new Print(MyPrint);

    print1("Hello from C# 1.0");

}


# 익명 메서드 이후 - 메서드를 따로 선언한 필요 없이 한 번에 처리가 가능하다.

delegate void Print(string msg);    # 델리게이트 선언 (C# 1.0과 선언하는 방법은 동일함)

 

# Form에 Button2를 올려놓고, 클릭 이벤트에서 호출한다고 하면..

private void Button2_Click(object sender, EventArgs e)

{

    Print print2 = delegate(string msg)

    {

        MessageBox.Show(msg);

    };

    print2("Hello");

}

 

3. Nullable 값 형식

# 과거 방식

int age = 0;    # 0이나 -1로 'null'처럼 처리했음 (명확하지 않음)


# Nullable 이후 - ?를 사용하여 null도 대입이 가능하다.

int? age2 = null;

bool? isActive = true;

 

4. foreach 개선

# 과거 방식

string[] names = new string[] { "가", "나", "다" };

 

for (int i = 0; i < names.Count(); i++)

{

    MessageBox.Show(names[i]);

}


# 개선 후

string[] names = new string[] { "가", "나", "다" };

 

foreach (string n in names)

{

    MessageBox.Show(n);

}

 

5. 속성 접근자 분리

# 과거 방식

public int Age { get; set; }    # 모든 곳에서 set 가능


# 개선 후

public int Age { get; private set; }    # 외부에서 읽기만 가능 - get, set 따로 public, private을 설정할 수 있다.

 

6. static class 도입

# 과거 방식 - public static class라는 게 없었음, 그래서 아래와 같이 선언하여 사용

public class MathHelperOld

{

    private MathHelperOld()

    {

    }

 

    public static int Square(int x) => x * x;

}


# static class 이후

public static class MathHelper

{

    public static int Square(int x) => x * x;

}

 

7. partial class

# 과거 방식 - partial이라는 게 없었음


# 개선 후 - class 이름이 같더라도 앞에 partial을 쓰면 하나의 파일로 인식한다.

partial class Customer

{

    public string Name { get; set; }

}

 

partial class Customer

{

    public int Age { get; set; }

}

 

8. 이터레이터 (yield)

# 과거 방식 - IEnumerable 직접 구현, IEnumerator 구현 필요


# 개선 후

IEnumerable GetNumbers()

{

    yield return 1;

    yield return 2;

    yield return 3;

}

 

9. TryParse 패턴

# 과거 방식

try

{

    int value = int.Parse("123");

}

catch

{

    # 예외 처리

}


# 개선 후

if (int.TryParse("123", out int result))

{

    MessageBox.Show(result);

}

 

10. Nullable 관련 연산자

# 과거 방식

string user = null;

string displayName = (user != null) ? user : "(이름 없음)";


# 개선 후

string user = null;

string displayName = user ?? "(이름 없음)";

 

11. 명시적 인터페이스 구현 개선

# 과거 방식 - 인터페이스 충돌 시 불명확

interface IPrintable { void Print(); }

interface IExportable { void Print(); }

 

class Report : IPrintable, IExportable

{

    public void Print()    # 어떤 인터페이스의 Print인지 불명확

    {

        MessageBox.Show("불명확");

    }

}


# 개선 후 - 명시적 인터페이스 구현으로 명확화

class ReportImproved : IPrintable, IExportable

{

    void IPrintable.Print() => Console.WriteLine("Printable report");

    void IExportable.Print() => Console.WriteLine("Exportable report");

}

728x90
반응형
LIST
728x90
반응형
SMALL
C#에서 Oracle.ManagedDataAccess.Client를 사용하고 있는데,
C#에서 프로그램 실행 시, 아래와 같은 예외가 발생하는 것을 볼 수 있었다.
'OracleInternal.NotificationServices.ONSException'(Oracle.ManagedDataAccess.dll)
프로그램에는 크게 지장은 없는 거 같지만 거슬리기에 예외 안 나게 처리하는 방법을 알아보도록 하자.

 

■ 방법 1 - ConnectionString을 바꾸는 방법

1. 아래 문자열 맨 뒤에 load balancing=false; ha events=false; 를 추가한다.

  - "Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = x.x.x.x)(PORT = xxxx)) (CONNECT_DATA = (SERVER =

      DEDICATED) (SERVICE_NAME = xxx))); User Id = xxx; Password = xxx; load balancing=false; ha events=false;"

 

■ 방법 2 - 소스에서 직접 추가

1. Connection 하는 소스 부분에 아래 소스를 추가한다. (하여튼 최종 접속 전에만 코딩해 주면 된다.)

  - OracleConfiguration.HAEvents = false;

  - OracleConfiguration.LoadBalancing = false;

 

■ ONS란?

1. ONS(Oracle Notification Services)는 Oracle Real Application Clusters(RAC) 및 Data Guard 환경에서 이벤트를 전달하는 기능이다. 

    즉, 데이터베이스 노드의 상태를 모니터링하여 장애 조치(Failover)나 상태 변경을 빠르게 알리기 위한 푸시 알림 시스템이다.

2. ONS를 사용하기 위해서는 ons.conf 파일을 구성해야 한다.

 

■ 예외 원인

1. Oracle ONS(Notification Services)가 정상적으로 구성되지 않았거나 필요하지 않은데 로드되었기 때문이다.

2. 단일 데이터베이스와 같은 경우, 위와 같이 처리하고, 그렇지 않으면 ons.conf파일을 구성하여 예외 처리를 해결해야 한다.

728x90
반응형
LIST
728x90
반응형
SMALL

■ .Net Framework와 .Net 8.0 차이점

.NET Framework .Net 8.0
출시 시기: 2002년 출시 시기: 2023년
Windows에 특화되어 있기 때문에
Linux나 macOS 같은 다른 운영 체제에서는 실행할 수 없음
Windows, Linux, macOS 등 다양한 운영 체제에서 실행 가능
클라우드 환경에서도 Windows 기반의 서버에서만 실행 가능 Docker 컨테이너 및 Kubernetes와 같은
클라우드 네이티브 환경에서 최적화됨
오픈소스가 아님 오픈소스
CLR(Common Language Runtime)을 사용 CoreCLR 및 Mono 런타임, AOT(Ahead-of-Time) 컴파일 지원
Windows 환경에서 동작하도록 최적화되었으나,
최신 기술 적용이 제한적
최신 기술을 적극적으로 수용하여, 속도, 메모리 효율성, 및
스케일링 능력이 뛰어남
새로운 기능 업데이트는 사실상 중단.
(마지막 버전: .NET Framework 4.8.1)

새로운 API나 기술(예: 최신 C# 기능, 성능 개선 등)은
지원하지 않음
지속적인 업데이트와 성능 개선

 

■ .Net 버전별 지원 상태

버전 출시일 지원 종료일 지원 상태
.NET 5.0 2020년 11월 2022년 5월 지원 종료
.NET 6.0 2021년 11월 2024년 11월 LTS, 현재 지원 중
.NET 7.0 2022년 11월 2024년 5월 Current, 지원 중
.NET 8.0 2023년 11월 2026년 11월 LTS, 최신 장기 지원
728x90
반응형
LIST
728x90
반응형
SMALL
코딩을 하다 보면 반복되는 구문이 사용되는 경우가 많다.
그래서 Visual Studio에서 제공하는 것이 코드조각 기능이다. mbox, try 등이 기본적으로 제공되지만,
개발자들이 XML 파일로 만들어서 사용할 수 있는 기능도 있다.
이 포스팅에서는 XML파일로 만들지 않고, 코딩 도중에 바로 만들어서 사용할 수 있는 방법을 알아보도록 하자.

 

■ Visual Studio 2022에서 Snippet Designer 2022 설치 방법

1. Visual Studio 2022을 실행하면 상단에 [확장 - 확장관리] 클릭하고, Snippet Designer 2022를 검색한다.

    검색하면 아래 항목이 검색되는데, 설치버튼을 클릭한다.

2. 설치버튼을 클릭하고, 아래와 같이 예약메시지가 나오면, Visual Studio 2022를 종료한다.

3. 종료하면 아래 이미지 순서대로 진행된다. 진행 후에 Visual Studio 2022를 다시 실행한다.

 

■ Visual Studio 2022에서 Snippet Designer 2022를 이용하여 코드조각 만들기

1. 테스트로 아래 이미지와 같이 Test 메서드 안에 MessageBox.Show를 코딩하자. 위의 Messagebox.Show는 기본적으로 내장되어 있는

    코드조각을 사용하여 생성한 소스다. 아래는 기본 MessageBox.Show 뒤에 Caption, MessageBox 버튼 및 아이콘을 넣었다.

    이 MessageBox.Show를 코드조각으로 만들려면, 만들 소스 Drag → 마우스 우클릭 → Export as Snippet를 클릭한다.

2. 아래와 같이 코드조각 세팅하는 화면이 나타난다.

  - Snippet : 코드조각 이름 (코드조각 파일 이름)

  - Language : 코드조각을 사용할 언어

  - Shortcut : 단축키 (코딩에 사용할 것이므로 가장 중요)

2. 각 항목을 설정하고 저장을 누르면 아래와 같이 저장 창이 뜬다. 저장을 누른다.

3. 이제 방금 코드조각을 실행해 보자. pm까지만 눌러도 코드조각 리스트에 나오는 것을 볼 수 있다. 

2. 두 번 탭을 누르면 아래와 같이 소스가 자동으로 생성된 것을 볼 수 있다.

3. [도구 - 코드 조각 관리자]를 클릭하여, 관리되는 코드 조각을 확인할 수도 있다. 

 

※ Visual Studio 2019도 마찬가지로 동일하게 진행하면 코드조각을 쉽게 만들 수 있다. 단, Snippet Designer로 검색하여야 한다.

 

728x90
반응형
LIST
728x90
반응형
SMALL

■ Visual Studio 2022 Community 설치 방법 

1. 아래 사이트로 가서 Visual Studio 2022 Community 파일을 클릭한다.

    https://visualstudio.microsoft.com/ko/vs/

2. 클릭하면 아래 화면과 같은 사이트로 이동하며, 별다른 클릭 없이 파일 다운로드가 시작된다.

3. 다운로드가 완료되면, 다운로드된 파일을 클릭한다. 아래와 같이 Visual Studio Installer 설치가 시작된다.

4. 설치 이후에 아래와 같이 설치할 항목을 체크한다. (C#을 할 것이기 때문에 아래 .NET 데스크톱 개발을 체크)

5. 아래와 같이 설치가 시작된다.

6. 설치가 완료되면 아래 이미지 순서에 따라 설정한다. (완료)

728x90
반응형
LIST
728x90
반응형
SMALL

■ Visual Studio 2022가 Visual Studio 2019보다 좋아진 점

1. Visual Studio 2019는 32비트 프로세스 기반으로 작동하여 메모리 사용이 4GB로 제한되지만, 2022는 64비트 프로세스 기반으로 작동하기

    때문에 더 많은 메모리를 활용할 수 있다.

2. 더 많은 메모리를 활용할 수 있기 때문에 프로젝트 로드, 코드 탐색, 솔루션 빌드 시간이 단축되었다.

3. 새로운 아이콘과 테마, 더 나은 검색 기능과 코드 편집기 성능이 향상되었다.

4. 향상된 IntelliCode 기능을 제공하여 더 정확하고 효율적인 코드 완성을 지원한다. AI 기반 도구와 개선된 코드 분석 기능이 포함되었다.

    예를 들어, IntelliCode는 반복적인 코드 패턴을 학습하여 더 나은 코드 제안을 제공한다.

5. 디버깅 및 진단 도구가 더욱 개선되어, 복잡한 문제를 더 쉽게 해결할 수 있다.

    예를 들어, Hot Reload 기능을 통해 코드 변경 사항을 즉시 적용할 수 있어 더 빠른 디버깅이 가능하다.

6. ARM64 기반 개발 환경을 지원하여 더 많은 디바이스에서 개발할 수 있다.

7. Visual Studio 2019는 .NET 5 이상의 버전에 대한 최신 기능 및 최적화는 제공하지 않으며,

    이후 버전의 Visual Studio 2022에서는 .NET 6 이상의 최신 기능을 보다 원활하게 지원한다.

■ Hot Reload 이란 무엇인가?

1. 개발자가 코드 변경 사항을 애플리케이션을 다시 시작하지 않고도 즉시 적용할 수 있게 해주는 기능이다.

    이 기능을 사용하면 개발자는 애플리케이션을 중단하지 않고, 변경 사항을 실시간으로 반영하여 빠르게 피드백을 받을 수 있다.

2. UI 요소를 수정하고 즉시 결과를 확인할 수 있어, 사용자 인터페이스 개발이 더 효율적이다.

3. 많은 웹 프레임워크(예: React, Vue.js 등)에서도 Hot Reload 기능을 제공한다.

 

■ ARM64 이란 무엇인가?

1. ARM은 Advanced RISC Machine의 약자로, RISC(Reduced Instruction Set Computer) 기반의 프로세서 아키텍처이다.

2. 64비트 주소 공간을 사용하여 더 많은 메모리를 활용할 수 있다. 이는 대규모 데이터 처리와 고성능 애플리케이션에 유리하다.

3. 전력 소비를 최소화하면서 높은 성능을 제공하여 배터리 수명이 중요한 모바일 장치나 임베디드 시스템에서 많이 사용된다.

4. 스마트폰, 태블릿, 노트북, 서버, IoT 장치 등 다양한 디바이스에서 사용된다.

728x90
반응형
LIST
728x90
반응형
SMALL

■ Visual Studio 항상 관리자 권한으로 실행하는 법

1. Visual Studio 실행파일로 이동한다. 경로를 모르면 아래 이미지와 같이 찾아간다.

2. devenv파일을 찾았으면 해당 파일에서 우클릭 후, 호환성 문제 해결을 클릭한다.

3. 아래 이미지와 같이 순서대로 진행한다.

4. 프로그램 테스트를 클릭하지 않으면 다음이 안 눌리므로, 프로그램 테스트를 꼭 클릭하도록 한다.

728x90
반응형
LIST
728x90
반응형
SMALL

■ Visual Studio Professional 2019 설치 방법 

1. 아래 사이트로 가서 Visual Studio Professional 2019 파일을 다운로드한다.(MS 계정이 있어야 함)

    https://visualstudio.microsoft.com/ko/vs/older-downloads/

2. 2019 왼쪽 상단 화살표를 클릭하여 펼치고, 다운로드 버튼을 클릭한다.

3. 다운로드 버튼을 누르면 MS에 로그인 창이 뜨는데, MS 계정이 있으면 로그인하고, 없으면 새로 만든다.

4. 로그인을 하면 다운로드할 수 있는 버전이 표시된다. (Visual Studio Professional 2019 다운로드)

5. 다운로드 한 Visual Studio Professional 2019 파일을 실행한다.

6. 아래 이미지와 같이 순서대로 진행한다.

7. 아래 이미지까지 넘어왔으면, C#을 사용할 것이기에 아래 이미지에 빨간 사각형이 있는 [.NET 데스크톱 개발]을 클릭하고 설치 버튼을 누른다.

8. 아래와 같이 설치가 시작된다.

9. 설치가 완료되면, Visual Studio 2019를 실행하고, [우측 하단에 코드를 사용하지 않고 계속]을 클릭한다.

10. 아래 이미지와 같이 [도움말 - Visual Studio 등록]을 클릭한다.

11. 아래 이미지와 같은 화면이 뜨면 [제품 키로 잠금 해제]를 클릭한다.

 

12. 구매했던 제품 키를 입력하면, 정식으로 Visual Studio Professional 2019를 사용할 수 있다.

728x90
반응형
LIST
728x90
반응형
SMALL
Visual Studio 2019 Professional을 설치하고 사용하다가, 제품키를 변경해야 하는 상황이 발생했는데,
변경하는 방법은 쉽지 않았다.
제품키를 변경하는 방법을 알아보도록 하자.

■ 구독을 하고 있는 경우, 레지스트리 삭제

1. 아래 이미지와 같이 [도움말 - Visual Studio 등록]으로 들어가서 나오는 창을 보면 [라이선스 제품 키 적용됨] 외엔 어디서도 제품키를 변경하는 부분은 없다.

    그러므로 레지스트리를 삭제해야 한다.

2. 실행(ctrl+r) 창에서 regedit를 실행한다.

3. HKEY_CLASSES_ROOT\Licenses 경로에서 [41717607-F34E-432C-A138-A3CFD7E25CDA]를 삭제한다.

    [2019 Professional registry key : 41717607-F34E-432C-A138-A3CFD7E25CDA]

4. 삭제하고 다시 들어가 보면, 아래 이미지와 같이 변경된 것을 볼 수 있다. 구독을 하고 있다면, [아래 업데이트된 라이선스 확인]을 눌러서 갱신한다.

■ 제품키를 구매한 경우

1. Visual Studio를 삭제하고 재설치한다.

2. 설치 후, [도움말 - Visual Studio 등록]으로 들어가면 아래 이미지와 같이, [제품 키로 잠금 해제]라는 항목이 보인다.

    클릭하여, 제품키를 입력한다.

728x90
반응형
LIST

+ Recent posts