본문 바로가기

C#

[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.. 더보기
[IL2CPP] Assembly.GetCallingAssembly 가 동작하지 않을 때 IL2CPP 환경에서 Assembly.GetCallingAssembly().GetTypes() 메소드가 기대한 것과 같이 동작하지 않을 때 어셈블리 문제알 수 없는 이유(버그?) 로 Assembly.GetCallingAssembly() 메소드는 Mono2x 일때와 IL2CPP 일 때 다른 값이 반환됩니다. 이를 해결하기 위해 해당 메소드 대신 typeof(FooType).Assembly 식의 접근법으로 어셈블리를 가져오는것으로 고칠 수 있습니다. (FooType은 찾고자 하는 어셈블리 안에 들어있는 타입이어야 합니다.) (또는) 코드 스트리핑 http://docs.unity3d.com/kr/current/Manual/iphone-playerSizeOptimization.html 스트립은 정적 코드 분석에.. 더보기
[Unity] Android keystore 경로 상대경로로 지정하기 유니티의 안드로이드 빌드 환경을 설정에서 키스토어 파일을 등록할 때, 일반적으로 Browe Keystore 버튼으로 파일을 등록하게 되면 위 사진과 같이 절대경로가 설정된다. 자동 빌드 환경이나, 서로 다른 빌드 머신에서 빌드하고자 할 때 굉장히 짜증나는 부분이며 제대로된 해결 방법은 없고 편법을 사용해야 하는 것을 보인다. 유니티 상단 메뉴 -> Edit -> Project Settings -> Editor -> Asset Serialization값을 Force Text 로 변경한다. 이 작업은 다른 설정 또는 .unity 파일도 모두 변경합니다. 프로젝트 경로 -> ProjectSettings 폴더 -> ProjectSettings.asset 을 열면 텍스트로 변환되어 있다. 이중 AndroidKey.. 더보기
[EF] PluralizingTableNameConvention PluralizingTableNameConvention 테이블 이름을 엔티티 이름의 복수화된 버전으로 만들어준다. (Item -> Items, Player -> Players)기본값은 적용이니, 수동으로 제거할 수 있다. using System.Data.Entity.ModelConfiguration.Conventions; public class MyDb : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); } } 이 작업은 마이그레이션이 필요하다. 마이그레이션 없이 실행하면 다음과 같은 익셉션이 발생한다.처리되지 않은 예외: System.Inva.. 더보기
[C#] NUnitLite, Jenkins CI 연동하기 http://pjc0247.tistory.com/26위 글에 이어서 NUnit Lite와 Jenkins CI를 연동하는 방법에 대해서 알아봅니다. Jenkins 쪽의 환경을 구성합니다. 아래 과정은 이 글에서는 생략합니다.1. 아이템을 만들고, 2. SVN, Git에서 체크아웃되도록 설정한 뒤 3. 프로젝트를 빌드합니다.프로젝트의 빌드는 MSBuild 플러그인을 사용하면 편리합니다. 젠킨스에 NUnit 플러그인을 설치합니다. https://wiki.jenkins-ci.org/display/JENKINS/NUnit+Plugin이 플러그인은 이전 글에서 언급한 테스트 결과 xml 파일을 읽어서 젠킨스상에 표시해주는 역할을 합니다. 또한 테스트 결과가 실패일 경우 빌드 결과도 실패로 표기합니다. (Jenkin.. 더보기
[Roslyn] 코드 정렬(Formatting) 하기 Code FormattingRoslyn을 이용하여 코드를 자동 정렬시킬 수 있습니다.먼저 Nuget 패키지 관리자를 통해 Microsoft.CodeAnalysis 패키지를 추가합니다. 출력 결과 혹은 MS에서 제공하는 별도의 도구를 사용합니다. https://github.com/dotnet/codeformatter 더보기
[Unity] JsonUtility 사용하기 Unity 5.3 버전에서의 변경 사항 중에는 JSON API의 추가가 포함되어 있습니다. (http://blogs.unity3d.com/kr/2015/12/08/unity-5-3-all-new-features-and-more-platforms/)이전 버전의 유니티에서는 JSON을 사용하려면 외부 라이브러리를 사용하여야 했는데, 각각의 JSON 라이브러리는 iOS/IL2CPP와 호환이 좋지 않은 것들도 있었으며, 게임에 추가한 외부 플러그인에서 JSON 라이브러리를 사용하는 경우도 있어 실제 게임 앱은 하나인데 그 안에 JSON 라이브러리만 2~3종류가 들어가있는 경우도 종종 있었습니다. 유니티에서는 아마 이러한 문제점들을 파악하고 이를 위한 해결책으로 Unity 자체적으로 JSON 라이브러리를 제공하게.. 더보기
[C#] Code Contracts 사용하기 Code Contracts는 이전 방식인 assert들을 깔끔하게 정리할 수 있는 새로운 방법입니다.Code Contracts를 사용하기 위해서는 먼저 Visual Studio 확장 프로그램을 다운받아야 합니다. https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970위 링크에서 프로그램을 다운받고 설치 후, Visual Studio를 재시작합니다. Code Contracts를 테스트하기 위한 테스트 솔루션/프로젝트를 만듭니다. 여기서는 C#을 사용하겠습니다. 프로젝트의 Properties에 들어가보면 탭 아래에 Code Contracts 탭이 새로 추가된것을 볼 수 있습니다. 해당 탭에 들어가서 아래 그림과 같.. 더보기
[C#] NUnit, NUnitLite 사용하기 이 글은 NUnit3을 기준으로 작성합니다. 테스트용 솔루션을 하나 만듭니다. 이름은 nunit_test 로 하고, 하위로 foo_library, tests 프로젝트를 두개 추가합니다.foo_library는 실제 구현체이고, '클래스 라이브러리' 프로젝트로 생성합니다.tests는 foo_library를 테스트하는 프로젝트로, '콘솔 응용 프로그램' 으로 생성합니다. 이 프로젝트는 '참조'에 foo_library를 가집니다. foo_library에 구현을 작성합니다. 간단하게 Sum 메소드를 만들어보겠습니다. 이제 Foo::Sum 에 대한 테스트를 작성해야 할 차례입니다.tests 프로젝트에 NuGet 패키지 추가 -> 'NUnit', 'NUnitLite' 를 추가합니다. NUnitLite는 설치 시, 자.. 더보기