본문 바로가기

개발/C#

(6)
VisualStudio와 NSIS를 이용한 설치파일 만들기 WPF 프로젝트를 진행 중 해당 앱의 설치 파일 요청이 들어왔습니다. 먼저, 오프라인에서의 설치가 필요하므로 간편하게 배포할 수 있는 ClickOnce는 배제하였습니다. 간략하게 계획은 다음과 같았습니다. 1. Microsoft Visual Studio Installer Project는 제약이 많으므로 스크립트로 구성할 수 있는(친숙하고 잘아는) NSIS로 선택하자. 2. VisualStudio에서 Release로 빌드 시 설치 파일까지 자동으로 만들어지도록 하자. 3. 닷넷 프레임워크 버전 확인하여 버전이 낮은 경우 자동으로 설치하자. 4. 앱에서 사용되는 자체 파일(확장자)의 아이콘을 표시하자. 위의 계획을 토대로 아래와 같은 프로세스로 진행되어 집니다. ※ 64비트 윈도우 10 환경에서 개발되었습니..
파일 작성 시 원자성 유지방법 원자성이란? 파일 작성 과정에서 정전등으로 인한 사고로 파일 작성 실패 및 손실까지 나는 경우가 발생합니다. 윈도우 NT계열 운영체제의 파일 시스템은 NTFS를 사용하는데 트랜잭션 처리 모델이 적용되었지만 파일 작성 시에는 트랜잭션 처리를 하지 못한다고 합니다. 위의 예제처럼 콘솔로 실행 중일 때 노트북(데스크탑)을 임의로 강제 종료하게 되면 첫 스크린샷처럼 NUL(\0)이 발생됩니다. MS에서는 이 문제를 지원하기 위해 TxF기술이 나왔지만 현재는 권장하지도 않고 지원도 하지 않는걸로 보입니다. 그래서 원자성을 지키기 위한 파일작성의 일반적인 접근 방법은 문서를 새 파일에 쓰고 원본 파일을 새 파일로 바꾸는 방법이라고 합니다. 중용한 파일을 작성할 때는 위 처럼 백업을 할 수 있는 방안을 마련하도록 해..
Immutable type: Shallow Copy한 복사개체에서 문자열 변수 값을 변경하였지만 원본개체에서는 변경되지 않은 이유는? Immutable의 사전 뜻은 "변경할 수 없는", "불변의"입니다. Immutable type은 말그대로 인스턴스 생성 후 멤버 데이터를 변경할 수 없는 타입을 말합니다. 처음 Immutable type을 그닥 신경쓰지 않았습니다. 겪을일이 없었기 때문이죠. 그러나 부제에서와 같이 Shallow Copy를 할 이유가 있어 하다보니 문득 의문이 들었습니다. "왜 복사개체에서 문자열 변수 값을 변경하였는데 원본개체의 문자열 변수에는 변경사항이 없는가? 내가 알고 있는 지식으로는 문자열은 참조형식이기 때문에 Shallow Copy에서 복사개체의 문자열또한 원본개체가 바라보는 주소와 같을텐데.."라고 생각하였습니다. 그러나 테스트를 해보았고 기대와 다른 결과가 나오게 되었습니다. 아래는 테스트 소스입니다.(/..
c#에서 오피스(워드, 엑셀등) 접근 방법 - COM object관련 c#에서 MS오피스(워드, 엑셀 등)를 핸들링을 할려면 굉장한 노가다가 필요합니다. (참조) https://www.add-in-express.com/creating-addins-blog/2013/11/05/release-excel-com-objects/ http://www.simpleisbest.net/archive/2005/05/31/156.aspx COM object에 대한 자원해제를 제대로 하지 않는다면 화면에 보이지는 않지만 그렇다고 죽어있지도 않는 오피스 프로세스가 어딘가에 존재하게 됩니다. 그래서 일일히 해당 개체들을 받아서 'Marshal.ReleaseComObject();' 해줘야 하는데요. 그러다 보면 해당 개체에 대한 선언, 할당, 해제부문이 많아 소스가 길어지게 되고 유지보수 하는데 ..
접근 제한자(Access Modifier) 접근 제한자는 외부로부터 클래스 혹은 클래스 멤버들(메서드, 속성, 이벤트, 필드)로의 접근을 제한할 때 사용하는 것으로 다음과 같은 종류가 있다. 1. public모든 곳에서 접근이 가능하다.2. protected파생 클래스에서 접근이 가능하다. class A { protected int x = 1; } class B : A { static void Main() { A a = new A(); B b = new B(); // 접근이 불가능 a.x = 2; // A에서 파생된 B클래스에서는 접근이 가능하다. b.x = 2; } } 3. private클래스 내부에서만 접근이 가능하다.4. internal동일한 Assembly내에 있는 다른 클래스들이 엑세스 할 수 있다.다른 어셈블리에서는 접근 불가.5. p..
string.IsNullOrEmpty 와 string.IsNullOrWhiteSpace 비교 string.IsNullOrEmpty 와 string.IsNullOrWhiteSpace 비교 1. string.IsNullOrEmpty - 지정된 문자열이 null이거나 Empty 문자열인지 여부를 나타냄 ※ string.Empty는 길이가 0인 문자열 ""을 나타냄bool result;result = string.IsNullOrEmpty(null); // trueresult = string.IsNullOrEmpty(""); // trueresult = string.IsNullOrEmpty(" "); // falseresult = string.IsNullOrEmpty("Test"); // false 2. string.IsNullOrWhiteSpace - 지정된 문자열이 null이거나 비어 있거나 공백 문..