본문 바로가기

개발언어/C#191

[c#] [StructLayout()]객체의 메모리 레이아웃에 대하여 클래스 혹은 구조체 객체의 크기는 일반적으로 필드 크기의 합보다 크게 표시되며, 객체의 필드들은 개발자가 정의한 순서대로 메모리 상에 위치하지 않는다. 이 노트는 이러한 현상의 이유와 해결법을 알아본다. 다음과 같은 구조체의 크기를 구해보자. struct MyStruct { public int i; // 4 public double d; // 8 public byte b; // 1 } 구조체의 크기는 각 필드 크기의 합이므로, 이론적으로 MyStruct 구조체의 크기는 4+8+1 = 13 이다. 크기를 구하기 위해 다음과 같이 Marshal.SizeOf()를 사용할 수 있다. int size = Marshal.SizeOf(typeof(MyStruct)); 하지만 실제 이 문장을 실행해 보면, size가 .. 2020. 11. 4.
[C#] [Flag] Enum Attribute는 무엇을 의미합니까? 예시 [Flags] public enum Options { None = 0, Option1 = 1, Option2 = 2, Option3 = 4, Option4 = 8 } 그 [Flags] 속성은 열거형이 단일 값이 아닌 가능한 값의 집합을 나타낼 때마다 사용해야 합니다. 이러한 컬렉션은 비트 연산자와 함께 사용되는 경우가 많습니다. 예를 들어 다음과 같습니다. var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue; 참고 [Flags] 속성은 스스로 이것을 가능하게 하지 않는다 - 단지 그것에 의해 멋진 표현을 허용하는 것이다. .ToString() 메서드 enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, .. 2020. 11. 4.
[C#] C# 코딩 표준 출처 : https://docs.google.com/document/d/13N-08EAVkeKkhWVxyh6UMEzVL6KwwXLT4aPV4uoqvMw/edit# C# 코딩 표준 원문(영어): C# Coding Standards 머리말 기본 원칙 가독성을 최우선으로 삼는다. (대부분의 경우 코드는 그 자체가 문서의 역할을 해야 함) 정말 합당한 이유가 있지 않는 한, 통합개발환경(IDE)의 자동 서식을 따른다. (비주얼 스튜디오의 “Ctrl + K + D” 기능) 본 코딩표준을 따라 잘 짜여진 기존의 코드에서 배운다. 참조문서 이 코딩 표준은 아래의 코딩 표준들에서 영감을 얻었음. 언리얼 엔진 4 코딩 표준 둠 3 코드 스타일과 규칙 IDesign C# 코딩 표준 IDE 도우미 비주얼 스튜디오에 ... .. 2020. 11. 4.
[C#] 고정크기배열 사용방법 #MarshalAs 앞서 포스팅한 자료와 마찬가지로 다음과같은 구조체를 만들어보면 public struct MyArray { public char[] charArray; public string str; } 크기는 8이 된다. fixed키워드를 사용하면 배열의 크기를 고정할 수 있지만, 안전하지 않은 코드(unsafe)영역으로 지정해야한다는 문제가 있다. MarshalAs키워드를 사용해 고정크기 배열 (혹은 고정크기 문자열)을 사용할 수 있다. [StructLayout(LayoutKind.Sequential)] public struct MyArray { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public char[] charArray; [MarshalAs(Unman.. 2020. 11. 3.
[C#] x86/x64 환경에 따라 달라지는 P/Invoke 함수의 export 이름 다음의 글은, C# - x86 실행 환경에서 SECURITY_ATTRIBUTES 구조체를 CreateEvent에 전달할 때 예외 발생 ; http://www.sysnet.pe.kr/2/0/11130 사실, 제가 CreateEvent Win32 API를 P/Invoke 테스트하면서 첫 번째 인자를 실수로 포인터가 아닌 구조체 값을 그대로 전달해 발생한 문제입니다. 재미있는 것은, 저 글에 대한 재현 소스 코드를 작성하면서 희한한 현상으로 보이는 ^^; 문제를 접하게 되었는데 그에 대해 하나씩 풀어낸 과정을 기록해 보겠습니다. 현상을 설명하기 위해, 우선 C++로 다음의 소스 코드를 가진 Win32 DLL 프로젝트를 준비합니다. // Header 파일 #pragma pack( push, 1 ) struct .. 2020. 11. 3.
[C#] WinAPI(Kernel32 dll) 사용하기 Kernel32.dll에서 GetSystemTime / SetSystemTime 호출해서 사용하기 C# / .NET 에서 Native DLL (Unmanaged DLL)에 있는 함수를 호출하는 P/Inovoke(Platform Invoke) 방식을 사용하여 C#에서 WinAPI를 호출하거나 C/C++로 작성된 Native DLL 함수를 호출한다. 1. DllImport 키워드를 사용해서 함수 호출하기 using System.Runtime.InteropServices; namespace TEST.APIs { public static class Kernel32 { [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetSys.. 2020. 11. 3.
[C#] if ~else if를 한 줄로 '삼항 연산자' ■ 삼항 연산자 ​ if ~else if 문을 한 줄로 표현합니다. ​ ​ ​ 문법 ​ ​ ※ 취할 값은 변수, 숫자, 문자, 문자열 등 다양하게 사용할 수 있습니다. ​ using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { int num1 = 10; int num2 = 20; void Start() { print(num1 == num2 ? "두 수가 같습니다." : "두 수가 다릅니다."); // 삼항연산자 } } 2020. 11. 3.
[c#] [StructLayout(LayoutKind.Sequential)] Serializable : 문자로 변환하기 위해서 선언(? 알려주기정도..)해준다. 1. StructLayout(LayoutKind.Sequential) : 나 구조체야 라고 선언한다 (나 구조체야, 라는 표현보다는 마샬링 성능에 대한 부분이라 볼 수 있습니다. [StructLayout] 키워드를 빼더라도 구조체는 사용할 수 있습니다.) Sequential Layout은 Managed Memory에서 마샬링을 사용해 Unmanaged Memory로 옮길 때 각 필드의 순서가 Unmanaged Memory에서 유지되는 레이아웃이다. 위의 예제에서 MyStruct구조체는 [StructLayout(LayoutKind.Sequential)]을 사용하고 있는데, 이는 Managed 메모리 영역에서는 순서가 어떨지.. 2020. 11. 2.
[C#] - internal 접근 한정자 intermal은 같은 어셈블리(DLL) 또는 exe 에서만 접근이 가능하도록 하는 한정자 입니다. ​ 다른 어셈블리에서도 접근할 수 있도록 하려면 public을 사용합니다. [출처] C# - internal 접근 한정자|작성자 펭순이 2020. 11. 2.
[C#] ref 키워드와 out 키워드의 차이 ref와 out 키워드는 인자로 넘긴 변수를 함수 내부에서 참조의 형태로 사용한다는 점에서 동일하다. 그러나 out 키워드는 ref보다 조금 더 특이한 상황에서 사용한다. ​ ref와의 차이점부터 정리하자면 out​은 초기화된 값이 인자로 들어오든 말든 상관이 없으나, ref는 초기화 된 값을 가지고 사용하는 데 초점이 맞춰져 있다. ​ 그리고 out은 해당 메서드가 끝나기 전까지 내부에서 인자로 받은 변수에 어떤 값이든 할당해야 하나, ref는 해당 값을 메서드 내부에서 변경하든 말든 상관없다. ​ 즉, ref는 레퍼런스이므로 값을 복사하지 않고 참조해서, 변수를 사용하거나 변경하는 것이 주 목적인 반면, out은 들어온 변수가 어떤 형태로 들어왔든 간에, 꼭 뭔가 값을 받아서 갖고 나가게 만들어야 한.. 2020. 11. 2.