본문 바로가기

C#

[C#] Thread.Abort시에도 안전한 코드 작성하기 private static int g = 0; static void Foo() { while (true) { try { } finally { for (int i = 0; i < 100; i++) g++; } } } static void Main(string[] args) { var t = new Thread(Foo); t.Start(); Console.Read(); Console.WriteLine("ABORT"); t.Abort(); Console.WriteLine(g); Console.Read(); } Thread.Abort가 일어나면 작업이 중간에 끊기게 된다,만약 해당 스레드가 전역적인 상태(위의 예제에서는 g)를 건드리는 코드가 포함되었을 경우에는 상태가 망가져 프로그램 전체가 오작동하게 되는 원.. 더보기
[Unity] ISO LanguageCode 가져오기 언어 코드 (language code) 가져오기 [DllImport("kernel32.dll")] private static extern int GetUserDefaultLCID(); var lcid = GetUserDefaultLCID(); var culture = new System.Globalization.CultureInfo(lcid); return culture.TwoLetterISOLanguageName; 유니티에서 C#의 컬쳐 코드를 가져오는 API (CurrentCulture) 를 사용하면 무조건 "en-US" 고정값이 나온다. ( https://feedback.unity3d.com/suggestions/fix-localization-issues-with-cor ) 이를 해결하는 (아마 유.. 더보기
[C# 7.0] 패턴 매칭, 디컴포지션 public class Data { public string name { get; set; } public int age { get; set; } } var data = new Data() { name = "Park", age = 11 }; if (data is Data {age is var a, name is "Park"}) { Console.WriteLine(a); } 패턴 매칭의 디컴포지션(decomposition) 기능을 사용하면, 타입 검사 + 프로퍼티 검사 + 변수 별명 붙이기를 한줄로 해결할 수 있습니다. 위 코드는 실제로 아래와 같이 해석됩니다. var _data = data as Data; if (_data != null && _data.name == "Park") { var a = _d.. 더보기
[C#] 슬랙(Slack) 봇 만들기 슬랙(https://slack.com/) 봇을 만들 수 있는 프레임워크를 제작하였습니다. 봇은 C# 스크립트로 동작하며, 아래는 가장 기본적인 예제입니다. [Subscribe("Hello")] public void OnHello(Message msg) { msg.Reply("Hi, " + msg.sender + "!"); } 프로젝트 깃허브 사이트 : https://github.com/pjc0247/Slacker* 봇을 헤로쿠에서 돌릴 수 있는 빌드팩과 가이드 또한 준비되어 있습니다.https://github.com/pjc0247/slacker_buildpack 더보기
[Unity] IL2CPP 에서 MissingMethodException 가 발생할 때 리플렉션 등을 이용할 때, 코드 스트리핑에 의해서 해당 생성자에 대해서 CPP 코드가 생성이 안된 경우 (리플렉션이 게임 코드에 없더라도, 게임 내부에서 사용하는 다른 라이브러리 코드에 있을 수 있다.)유니티는 쓰지 않는다고 판단하는 코드는 자동으로 제거하기 때문에, 쓰는척을 해줘야한다. 아래 코드는 코드 스트리핑을 방지하기 위한 트릭 (아래 익셉션은 주로 json 라이브러리에서 일어난다.,)MissingMethodException: Method not found: 'Default constructor not found...ctor() of System.ComponentModel.Int32ConverterMissingMethodException: Method not found: 'Default const.. 더보기
[C#] Activator.CreateInstance 가 생성자를 못 찾을 때 Activator.CreateInstance 메소드가 가끔 생성자를 찾지 못하고 MissingMethodException 을 발생시킬때가 있습니다. 이는 해당 메소드가 조금 멍청해서, 주어진 정보로 알맞은 생성자를 찾아내지 못해서 발생하는 문제인데, 이 경우에는 Activator.CreateInstance 메소드를 사용하는것이 아닌 직접 생성자 메소드를 찾아서 Invoke로 호출해줘야 합니다. 코드는 아래와 같습니다. var instance = new TypeToConstruct(1234, "hello"); Type[] argTypes = new Type[] { /* TYPES */ typeof(int), typeof(string) }; object[] argValues = new object[] { /.. 더보기
[C#] 필립스 Hue 라이트 제어하기 필립스 Hue 라이트의 써드파티 SDK인 Q42.HueAPI 라이브러리를 이용하여 조명을 제어하는 방법을 알아봅니다.https://github.com/Q42/Q42.HueApi 다른 언어의 SDK 목록은 아래 링크에서 찾아볼 수 있습니다. http://www.developers.meethue.com/tools-and-sdks 먼저 NuGet 패키지 관리자에서 Q42.HueAPI를 설치합니다. using Q42.HueApi; using Q42.HueApi.Interfaces; IBridgeLocator locator = new HttpBridgeLocator(); IEnumerable bridgeIPs = await locator.LocateBridgesAsync(TimeSpan.FromSeconds(5).. 더보기
[C#] 콜스택 가져오기 using System.Diagnostics; var st = new StackTrace(); foreach (var frame in st.GetFrames()) { Console.WriteLine(frame.GetFileLineNumber()); Console.WriteLine(frame.GetFileName()); Console.WriteLine(frame.GetMethod()); } StackTrace기능을 사용하면 로그에 콜스택 정보를 포함시키거나, 자동적으로 호출자의 이름과 위치가 출력되는 는 Logger를 만들 수 있다. * System.Linq.Skip 같은 기능을 이용하여 위에서 몇번째의 콜스택은 무시하도록 만들 수 있다.* 이 기능은 옛날에 Unity와 IL2CPP 환경에서 동작하지 않았.. 더보기
[C#] Action과 Func의 차이점 Action제너릭 인수가 전부 파라미터에 이용됩니다. 값을 반환할 수는 없습니다. Action foo = (string arg) => { /* return은 사용할 수 없습니다. */ }; Action foo = (string arg1, string arg2) => { /* return은 사용할 수 없습니다. */ }; Func마지막 제너릭 인수가 리턴 타입으로 사용됩니다. 나머지는 파라미터로 이용됩니다. Func foo = () => { return "hello"; }; Func foo = (string arg) => { return "hello"; }; 더보기
[Nancy] 에러 핸들링, 핸들러 등록하기 라우터가 요청을 처리중에 발생한 익셉션을 전역적으로 한군데서 받아서 처리할 수 있다. IApplicationStartup을 구현한 클래스가 public으로 존재할 경우, 별도의 초기화/등록 코드 없이도 Nancy가 알아서 해당 클래스를 파이프라인에 등록한다. /// /// 요청 처리 중 발생한 익셉션에 대한 정보를 /// 정형화된 ResponsePacket 형태로 만들어서 알려준다. /// public class ExceptionHandler : IApplicationStartup { public void Initialize(IPipelines pipelines) { // ctx : NancyContext // ex : Exception pipelines.OnError += (ctx, ex) => { l.. 더보기