c#

    [C#] 포인터 관련 unsafe fixed 키워드

    포인터를 사용하면 CLR에서 안전성을 책임지지 못하고, 불완전한 코드가 된다고 하며 에러를 발생하는데, 이렇게 예전 코드를 사용해야 할 경우, 빌드 속성을 변경해줌으로써 unsafe 코드를 사용 할 수 있다.사용 방법형식 또는 멤버 선언에서 unsafe 한정자를 사용할 수 있으며, 이렇게 선언해줄 경우 안전하지 않은 컨텍스트로 간주된다.  fixed 지시어는 unsafe 컨텍스트에서만 허용된다.  클래스가 인스턴스화 되면  CLR에 의해 언제든지 메모리가 이동 될 수 있는데, fixed 지시어를 이용하면 해당 코드에 들어간 변수 및 객체는 가비지 콜렉팅이 발생할 때 주소 재배치 대상이 아니게 된다.unsafe private uint reload(){ uint s0 = 0, s1 = 0; int..

    [C#] Marshal

    1. 데이터 타입IntPtr IntPtr 형식은 그 크기가 플랫폼마다 고유한 정수로 디자인 되었다. 즉, 이 형식의 인스턴스는 32비트 하드웨어 및 운영 체제에서는 32비트로, 64비트 하드웨어 및 운영 체제에서는 64비트여야 한다.  IntPtr 형식은 포인터를 지원하는 언어에서 사용할 수 있으며, 포인터를 지원하는 언어와 포인터를 지원하지 않는 언어 사이에서 데이터를 참조하는 일반적인 방법이 된다.  핸들을 보관하는 데도 IntPtr 개체를 사용할 수 있다. 예를 들어, IntPtr의 인스턴스는 파일 핸들을 보관하기 위해 System.IO..::.FileStream 클래스에서 광범위하게 사용된다.  IntPtr 형식은 CLS 규격이지만, UIntPtr 형식은 그렇지 않다. 공용 언어 런타임에서는 In..

    [C#] 관리되는, 관리되지 않는 코드

    관리되는 코드.NET CIL로 작성하고 컴파일 하는 .NET상의 코드 -GC 메모리 관리가 된다 관리되지 않는 코드기계 코드를 직접 컴파일 하도록 컴파일되는 .NET에 없는 코드 -GC 메모리 관리가 안된다.ex) 윈도우 시스템 자원IntPtr - 인터포인터관리되지 않는 메모리 블록에 대한 포인터 정수형 포인터를 의미하는 값 형식의 타입포인터는 메모리 주소값을 보관하는 곳IntPtr 타입은 메모리 주소를 가리키는 것 외에 윈도우 OS의 핸들값을 보관하는 용도로 쓰인다. 핸들은 윈도우 OS가 특정 자원에 대한 식별자로서 보관하는 값인데 일례로 파일이 좋은 예다.파일처리, OS에서 제공되는것 처리를 할 때 사용된다.ex) 이미지 처리에서도 쓰인다.Marshal Class - 마샬관리되지 않는 메모리 블록 ..

    [C#] DLL 파일 생성, 참조하는 법

    DLL이란?DLL (Dynamic Link Library)은 동적 링크 라이브러리의 약자로 표준화된 함수나 데이터를 모아놓은 것을 의미한다. 장점) - 한 코드를 여러 프로그램이 동시에 사용하기 때문에 메모리가 절약된다.- 리소스의 교체가 가능하다.- 재사용성이 뛰어나다.- 정적 링크를 사용하는 경우 실행 파일에 라이브러리의 함수가 모두 포함되어 실행파일이 커지지만 DLL을 사용하는 프로그램은 크기가 작다. C#을 이용해 DLL 파일을 생성 및 참조하는 방법은 다음과 같다 1. Visual Studio 실행 후 새 프로젝트를 만든다. 2. 이때 프로젝트 템플릿은 클래스 라이브러리로 생성해줘야 한다. 3. 프로젝트 명은 Calculator로 이름 짓고 다음을 클릭한다. 4. 클래스 명을 'Cal'으로 변경..

    [C#] Newtonsoft.Json 사용방법

    먼저 Nuget으로 Newtonsoft.JSON을 다운, 참조한다. 샘플 코드 아래 data1와 data2를 참조하려면 JsonExample 클래스로 받아와야 하는데 이때 제너릭 함수를 활용한다. using System; using Newtonsoft.Json; namespace NewtonsoftExample { class JsonExample { public int data1 { get; set; } public string data2 { get; set; } } class Program { static void Main(string[] args) { // Json 형식의 데이터 var json = "{'Data1' : 1, 'Data2' : 'Test'}"; // Json 형식의 string 값을 ..

    [C#] Nuget이란?

    NuPack 기반의 NuGet은 free and open-source package manager desigend for the MS developer platform 이다. .Net 프레임워크를 위한 소스코드 관리자이다. C# 기반으로 시작되어, 2013년 부터 native c++ 프로젝트를 지원하면서 visual studio에서 가장 대표적인 오픈소스 지원 프로젝트 2010부터 시작되어, 2012 vs 버전 부터는 기본설치로 제공 되었음. NuGet은 visual studio add-in 으로서, .net을 기본으로 하여, c++, cross-platform 지원 등을 통해, 그 범위를 넓혀 다양한 오픈소스 프로젝트들을 지원함으로서, NuGet Eco-System을 구축해 나아가고 있다. 환경 NuG..

    [C#] 람다식 (Lambda Expression)

    람다식(Lambda)식은 접근자, 함수 이름, return문이 없는 익명 함수(anonymous function)다. 람다식을 사용하면 더 짧은 코드를 작성할 수 있으며 => 연산자를 사용한다. class Program { static int DoubleFunc(int num) { return num * 2; } static void Main(string[] args) { Console.WriteLine(DoubleFunc(10)); } } // 람다식 사용 class Program { static void Main(string[] args) { Func DoubleFunc = (num) => num * 2; int num = 10; Console.WriteLine(DoubleFunc(num)); } }..

    [C#] 배열의 타입을 변경하는 방법 (제네릭 가능)

    1. Array 클래스의 ConvertAll 메서드 public static TOutput[] ConvertAll ( TInput[] array, Converter converter); TInput[] array - 특정 타입으로 변환하고 싶은 배열을 전달한다. Convert converter - 배열의 요소를 특정 타입으로 변환하는 변환기를 전달한다. - TInput: 기존 배열의 타입을 설정한다. - TOutput: 변환하고 싶은 타입을 설정한다. ConvertAll() 메서드는 특정 타입으로 변환된 새로운 배열을 반환한다. 다음 예제는 string 타입의 배열을 int 타입의 배열로 변환된 새로운 배열을 반환한다 class Program { public static int stringToInt(st..

    [C#] String Interning

    C#의 string.Intern 이라는 메서드는 문자열 풀에서 문자열을 풀링시켜 메모리를 아끼고 메모리 비교를 더 빠르게 해준다. 쓰는건 정말 간단하다. a = string.Intern("this is string") 으로 문자열을 넘기면 끝이다. 간단하게 퍼포먼스 비교를 해보자. string a = "dolphin"; string b = "dol"; b += "phin"; bool res = false; var sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 100000000; i++) res = a == b; sw.Stop(); Console.WriteLine("Before intern:"); Console.WriteLine(sw.ElapsedMilli..

    [C#] 고성능 서버 - __FILE__, __LINE__ 대체제

    UI가 없는 서버에서 동작의 내용을 확인하는 가장 기본적인 방법은 file로 남기는 log다. 정상 동작이나 오류상황에 대한 상세한 로그가 남아야 문제가 생겼을 때 파악하기가 쉽기 때문에, 간단한 동작이지만 아주 빈번하게 호출되는 부분이다. 로그 출력에서 성능을 많이 빼앗기지 않도록 기반을 다져놓으면 비즈니스 로직 구현을 위해 더 많은 H/W 리소스를 배분할 수 있다. 성능을 굳이 신경쓰지 않는다면 아래 있는 내용을 끝까지 모두 적용할 필요는 없다. 콜스택을 얻어와서 가장 마지막 함수를 찍는 방법 현재 스레드 컨텍스트에서의 StackFrame 정보를 얻어온 후, 프레임 데이터의 가장 마지막 부분을 읽어 호출자의 정보를 얻어낼 수 있다. 가장 태초부터 있었던 방법이기 때문에 C#으로 함수 호출 위치를 얻어..