C# Debug / Release 체크해서 코드 실행하기

CSharp
C#으로 개발을 하다 보면은 Debug에서만 작동해서 테스트를 위할 때가 있습니다. Release와 동일하게 하면 좋지만은 겨우 확인을 위해서만 필요한 사항인데, 빌드할때 빼먹으면은 남기도 하고 하는등이 피폐한 부분이 있어서 조금은 코드를 찾아보니 좋은 조건문이 있어서 기록을 합니다. #if DEBUG Console.WriteLine("Mode=Debug"); #else Console.WriteLine("Mode=Release"); #endif 이제 그냥 디버그와 릴리즈 일때 구분하지 않고 코드를 나두고 작업을 합니다. 물론 최종 출시전에는 위에 코드가 없는편이 깔끔하고 좋지만은 한창 개발중인 기능에 대해서는 긴급하게 업데이트도 필요하기 때문에 나두면은 좋습니다. 물론 실행을 막아주기도 하는등의 좋은 기능도 있습니다. 주석을 잘 남기는것도 좋지만 확실히 디버그 일때와 릴리즈 모드에 대해서도 구분을 하고 개발을 하면 좋을것 같습니다.
Read More

윈도우 시간 동기화

CSharp
프로그램을 개발하면서 윈도우의 시간동기화가 필수적으로 필요하게 되었습니다. 당연히 윈도우가 자동으로 잘 동기화를 하고 있겠지만은 그렇지 않은 경우에는 강제로 동기화를 해야 하는데, 컴퓨터가 그냥 자동으로 작업을 할 경우에 시간에 예약이 있을 경우에 시간이 동기화가 되지 않으면은 작업이 늦어지기에 한번씩 동기화를 해줘야 합니다. /// <summary> /// Gets the current DateTime from time-a.nist.gov. /// </summary> /// <returns>A DateTime containing the current time.</returns> public static DateTime GetNetworkTime() {     return GetNetworkTime("time.windows.com"); // time-a.nist.gov }   /// <summary> /// Gets the current DateTime from <paramref name="ntpServer"/>. /// </summary> /// <param name="ntpServer">The hostname of the NTP server.</param> /// <returns>A DateTime containing the current time.</returns> public static DateTime GetNetworkTime(string ntpServer) {     IPAddress[] address = Dns.GetHostEntry(ntpServer).AddressList;       if (address == null || address.Length == 0)         throw new ArgumentException("Could not resolve ip address from '" + ntpServer + "'.", "ntpServer");…
Read More

[CSharp] Zip 파일 압축, 해제

CSharp
참조할 어셈블리System.IO.CompressionSystem.IO.Compression.FileSystem // 압축 풀기 using (ZipArchive zipArchive = ZipFile.OpenRead(LOCAL_FILE)) { foreach (ZipArchiveEntry zipArchiveEntry in zipArchive.Entries) { try { string folderPath = Path.GetDirectoryName(Path.Combine(LOCAL_ZIPARCHIVE_PATH, zipArchiveEntry.FullName)); // if (!Directory.Exists(LOCAL_ZIPARCHIVE_PATH)) { Directory.CreateDirectory(LOCAL_ZIPARCHIVE_PATH); } // zipArchiveEntry.ExtractToFile(Path.Combine(LOCAL_ZIPARCHIVE_PATH, zipArchiveEntry.FullName), true); } catch (PathTooLongException pt_ex) { Console.WriteLine(pt_ex); } } } // 압축하기 using (FileStream fileStream = new FileStream(SFTP_DOWNLOAD_LOCAL_PATH, FileMode.Create, FileAccess.ReadWrite)) { using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Update)) { try { foreach (string filePath in Directory.EnumerateFiles(DOWNLOAD_LOCAL_ZIPARCHIVE_PATH, "*.*", SearchOption.AllDirectories)) { string relativePath = filePath.Substring(DOWNLOAD_LOCAL_ZIPARCHIVE_PATH.Length + 1); try { zipArchive.CreateEntryFromFile(filePath, relativePath); } catch (PathTooLongException pt_ex) { Console.WriteLine(pt_ex); } } } catch (Exception ex) { Console.WriteLine(ex); } finally { zipArchive.Dispose(); fileStream.Close(); } } } 단순하게 참조만 추가하니 정상적으로 되지 않아서 참조 방법을 조금더 자세히 기록을 합니다. 변경일 : 2021.06.19
Read More

[CSharp] SFTP

CSharp
ConnectionInfo ci = new ConnectionInfo(SFTP_HOST, SFTP_PORT, SFTP_USER, new PasswordAuthenticationMethod(SFTP_USER, SFTP_PASS)); using (var sftpClient = new SftpClient(ci)) { try { // sftpClient.KeepAliveInterval = TimeSpan.FromSeconds(60); sftpClient.ConnectionInfo.Timeout = TimeSpan.FromMinutes(180); sftpClient.OperationTimeout = TimeSpan.FromMinutes(180); sftpClient.Connect(); sftpClient.DeleteFile(SFTP_PATH); sftpClient.Disconnect(); // sftpClient.Connect(); sftpClient.BufferSize = 4 * 1024; using (FileStream fs = new FileStream(LOCAL_FILE, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { sftpClient.BufferSize = 4 * 1024; sftpClient.UploadFile(fs, FILE_NAME, true); } sftpClient.Disconnect(); // sftpClient.Connect(); sftpClient.DownloadFile(SFTP_DOWNLOAD_SERVER_PATH, LOCAL_FILE); sftpClient.Disconnect(); } catch (System.Net.Sockets.SocketException socket_ex) { MessageBox.Show(socket_ex.Message, "경고"); } catch (Renci.SshNet.Common.SshAuthenticationException ssh_ex) { MessageBox.Show(ssh_ex.Message, "경고"); } }
Read More

[CSharp] MySQL 접속 처리

CSharp, Database
using (dbConnection = new MySqlConnection("Server={0}Port={1};Database={2};Uid={3};Pwd={4}")) { try { /* INSERT, UPDATE 처리 */ dbConnection.Open(); dbQuery = string.Format("UPDATE `table` SET colume = '{0}' WHERE idx = '{1}'", VALUE, IDX); dbConnection.Open(); dbCmd = new MySqlCommand(dbQuery, dbConnection); dbCmd.ExecuteNonQuery(); dbConnection.Close(); /* bind 형식 */ dbConnection.Open(); dbQuery = "INSERT INTO log (`content`,`ip`,`creator`) VALUES (@content,@ip,@creator); "; dbCmd = new MySqlCommand(dbQuery, dbConnection); var bind1 = new MySqlParameter("@content", this.logString() + TEXT +"했습니다."); dbCmd.Parameters.Add(bind1); if( dbCmd.ExecuteNonQuery() == 1) { //성공 } dbConnection.Close(); /* SELECT */ dbConnection.Open(); dbQuery = string.Format("SELECT * FROM `table` WHERE idx = '{0}'; ", IDX); dbCmd = new MySqlCommand(dbQuery, dbConnection); dbTable = dbCmd.ExecuteReader(); if (dbTable.HasRows) { while (dbTable.Read()) { dbTable["cnt"].ToString().Trim(); } } } catch (MySqlException db_ex) { MessageBox.Show(db_ex.Message, "경고"); } finally { } } 그냥 소스코드의 일부 기능을 정리한 코드 입니다. 누군가가 바로 사용할 정도의 코드가…
Read More

[CSharp] datagirdivew 설정

CSharp
C#으로 개발을 하다 보면은 datagridview를 사용할 일이 너무 많아서 한번 기록을 해두기 위해서 글을 작성합니다. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; dataGridViewCellStyle1.Font = new System.Drawing.Font("맑은 고딕", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(165))); dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; //줄바꿈 this.dataGridViewFileList.Columns.Clear(); this.dataGridViewFileList.Rows.Clear(); this.dataGridViewFileList.Refresh(); this.dataGridViewFileList.BorderStyle = BorderStyle.None; this.dataGridViewFileList.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; this.dataGridViewFileList.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; this.dataGridViewFileList.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal; this.dataGridViewFileList.BackgroundColor = Color.White; this.dataGridViewFileList.DefaultCellStyle.SelectionBackColor = Color.FromArgb(0, 161, 218);//선택시 this.dataGridViewFileList.DefaultCellStyle.SelectionForeColor = Color.White; //선택시 this.dataGridViewFileList.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;//Color.FromArgb(236, 240, 241); this.dataGridViewFileList.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(228, 170, 102); this.dataGridViewFileList.ColumnHeadersDefaultCellStyle.ForeColor = Color.White; this.dataGridViewFileList.SelectionMode = DataGridViewSelectionMode.FullRowSelect; this.dataGridViewFileList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; this.dataGridViewFileList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; this.dataGridViewFileList.DefaultCellStyle.WrapMode = DataGridViewTriState.True; //줄바꿈 this.dataGridViewFileList.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(165))); this.dataGridViewFileList.Visible = true; this.dataGridViewFileList.ReadOnly = true; this.dataGridViewFileList.MultiSelect = false; this.dataGridViewFileList.AutoGenerateColumns = false; this.dataGridViewFileList.RowHeadersVisible = false; this.dataGridViewFileList.ShowCellErrors = false; this.dataGridViewFileList.ShowCellToolTips = false; this.dataGridViewFileList.ShowEditingIcon = false; this.dataGridViewFileList.ShowRowErrors…
Read More

[C#] 파일 관리 Application

CSharp
회사에서 급하게 진행된 Application 입니다. Web서비스중에서 첨부파일에 대해서만 Application에서 관리를 하기 위해서 만들어진것입니다. web의 기능과 동일하게 작동을 해야 하는 부분에서 DB 분석을 해서 Web과 동일하게 작동을 하도록 만든점이 상당한 노력을 기울였습니다. 그외 부분은 파일 전송과 파일감시 기능은 Application의 고유 기능이라서 그다지 힘들었다기보다는 새로운 기술을 익히는 과정이라서 즐겁기까지 하였습니다. 해당 Application은 웹에 올린 파일을 Local에 다운받고 해당 파일의 변경 여부를 하여서 다시 Web Server에 올려주는 과정을 합니다. Up,Down 과정에서는 Web의 제약사항인 파일 사이즈의 문제를 해결 하기 위해서 SFTP 기능을 이용해서 파일을 Up,Down하도록 해서 대용량 파일이라도 Server에 올라가도록 하는 기능을 구현을 하였습니다. 또한, 압축된 파일을 자동적으로 압축해제 하고 파일을 볼 수 있도록 하면 그 파일중 1개라도 변경이되면은 다시 압축을 하는 과정도 거치게 되어 있어서 조금 복잡하게 변한 부분도 없지 않아 있지만, 사용자분들이 일단은 괜찮다는 평이 좋았습니다.
Read More

MySQL 엑셀로 산출물 만들기

CSharp, Database
문서를 작성해야 하는 일이 항상 있습니다. 그중에서 가장 귀찮은 일이 MySQL의 DB의 형식이나 현재 어떤 스키마를 가지고 있는지를 문서를 만드는 일이 정말 귀찮습니다. 물론 처음 문서를 작성하고 나서 큰 변화가 없다면은 다행이지만 항상 똑같은 상태라고 할 수가 없다 보니 매번 문서를 만들어야 하는 일이 정말 귀찮기만 할뿐입니다. 그렇다고 매번 Database에 들어가서 명령어를 실행하고 만드는것도 일입니다. 고정된 형태면 좋지만 다른 사람에게 공유하기 위해서로 문서로 만들어야 하는 일이 발생을 하게 되면은 또 다시 세팅하고 실행하고 결과값을 저장하는 일이 반복되는 일을 줄이는것이 가장 큰 목표였습니다. C#으로 만들다보니 엑셀 파일 만드는것이 가장 큰 일이였습니다. 내가 설치된 컴퓨터의 환경에 맞추면은 가장 좋지만은 프로그램이라 함은 어느정도 범용성을 가져야 하기에 엑셀로 출력하는 방식에서 많은 고민을 하였습니다. 물론 그전에 MySQL에서 정보를 빼 내는 로직 자체는 이미 완성되어 있어서 그래도 실행을 하면 되지만 마무리가 되지 않아서 한참을 헤메이다가 우연한…
Read More

업무기록 공유 및 기록

CSharp
팀원간에 메신저로만 하다보니 이후에 정리하기기 귀찮아서 져서 만들게 된것입니다. 보고를 위한 일이 되어 버렸지만 팀원간에 서로간에 무슨일을 하고 있는지 투명하게 공개를 하고 하루 하루 일지를 남기듯이 하도록 하였습니다. 일단 별다른 기능은 없으며 일일간 하여서 서로 공유 할수 있으면 ID, PASSWORD 설정으로 본인외에는 글을 수정 할 수 없도록 막아 놓은것입니다. 정말 간단하면서 서로 공유도 하고 팀원간에 서로간의 내용을 확인할수 있어서 좋다는 생각입니다. 물론 이것을 정리해야 되는 제 입장에서는 여기서 보고서 양식으로 출력하는 기능을 더 붙여야 하겠지만은 지금은 서로간에 공유 할 수 있도록 한것만으로 작지만 단순적인 일을 줄이게 되었습니다. 개발팀이 새롭게 꾸려지다 보니 이런 일이 현재는 정립이 되지 않았고 윗선에는 협업툴에 대해서 아직은 회의적이라서 만들게 된것입니다. 개인 개발자다보니 협업툴이 좋은것이 많지만 입맛에 맞는것도 없고 해서 이렇게 만들게 된것입니다. ps. 참고로 공개는 하지 않습니다.
Read More
Asterisk에서 인입콜 취득

Asterisk에서 인입콜 취득

CSharp
Asterisk IP-PBX 교환기를 사용하고 있는분께서 모든 전화를 받을수 없으셔서 인입되는 모든 Call 정보를 획득하는 방법을 문의 하셨고 만들게 되었습니다. 부가적인 기능으로 인입되는 DID 번호에 따라서 메모를 기록하고, SMS/LMS를 보내는 기능까지 함께 합쳐서 만들어진 기능입니다. 이렇게 하면서 상담원이 늘어나면서 이제 상담원에 대한 인증기능을 붙이게 되었으며, 발신번호를 변경가능하게 만들어지게 되었습니다. 정보를 취득후 서버에서 관리할수 있도록 하는 기록 서버가 있어서 모든 기록이 365일 24시간 계속 기록됩니다.
Read More

윈도우 응용프로그램에 전자서명을 해야 될듯…

CSharp
가끔식 주변분들에게 윈도우 응용프로그램을 만들어 드리는편입니다. 이전에는 그냥 배포라는 생각이 없어서 전자서명을 할 생각이 없었지만 조금씩 숫자가 늘어나면서 생각을 바뀌야 될듯 합니다. 공식적으로 불특정 다수에게 공개해서 사용하도록 하는 일을 만들지 않으려고 하는편입니다. 사용하는 기술이 한발을 잘못 디디면은 불법이라는 형식으로 갈 수 있어서 그렇게 좋은 형태는 아닙니다. 하지만, 프로그램이라는것은 사용하시는분이 불편해서 만들어 달라는것이지, 사용할 일이 없으면은 절대 만들 이유가 없다고 보기에 만들어 드리는 편입니다. 이렇게 만든게 시간이 조금씩 흐르니 하나하나 쌓여서 이제 몇개가 사용되는 편입니다. 그렇다 보니깐 이제 전자서명을 해서 윈도우에서 사용하는데 불편함을 조금 들어 드리기 위해서 해야 된다고 생각을 합니다. 업데이트 문제도 있고해서 짧지는 않지만 장기간을 보고 하다 보면은 언젠가 Microsoft에서도 크게 문제가 없다고 인정해주지 않을가 싶어서 전자 서명을 시도합니다. 사설 전자서명이라서 기간이 2040년까지 인데 앞으로 20년을 제가 이 일을 할지 여부를 알 수 없기에 기간은 넉넉하다도 보여져서 만들어서 사용하는…
Read More

C# 메모리 강제 회수

CSharp
GC.Collect()를 사용하였지만 정말 획기적으로 줄지 않아서 사용하게 되는것입니다. using System.Runtime.InteropServices; // [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)] // private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize); /// <summary> /// 강제 메모리 회수 /// </summary> public static void FlushMemory() { GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); } } 남발을 할 경우 사용상에도 문제가 있고 하니, 적절히 필요한 부분에서 사용을 해야 될듯 싶습니다. 저 같은 경우은 datagridview를 몇개를 사용하다 보니 도저히 메모리 관리가 되지 않아서 지워준 경우가 됩니다. datagridview를 사용해서 표현은 하지만 Row 마다 수정은 막혀 있기도 하고 풀어 놓기도 해서 입니다. 수정 권한이 있는 사용자에게는 단순히 data를 보여주기만 하면 되어서 큰 문제가 없어서 메모리를 관리를 하는 용도로 사용을 합니다.
Read More

VisualStudio C# Debug창에 출력하기

CSharp
using System.Diagnostics; static class Program { static void Main() { Debug.WriteLine("메세지 내용"); } } 항상 사용을 할 수 있다는것은 알지만 기억이 나지 않아서 간단히 정리합니다. 평소에는 그냥 평하게 Console 창에 이용하기 때문에 사용할 수 있지만, 속성을 변경해야 하는 불편함도 있고 하여서 기록을 합니다. 이곳에 기록을 해 놓아도 기록여부를 기억하지 않으면 나중에 또 기억이 나지 않겠지만 일단 기록 입니다.
Read More
Visual Studio Installer Project 사용하기

Visual Studio Installer Project 사용하기

CSharp
확장 > 확장관리 :: 검색어 "installer"를 입력하면 설치 할 수 있습니다. Installer프로젝트의 자세한 사용법은 검색을 통해서 알아 보시기 바라며, 제가 기록할 내용은 설치할 경로에 대한 정보 입니다. 제가 이 사진을 올린 이유는 속성창중에서 "Manufacturer" 이부분이 중요해서 입니다. 아래의 사진중에서 경로를 지정할수 있습니다. 하지만, 이 프로그램이 설치될 상위 디렉토리에 대해서 설정을 여기서 할 수 있습니다.보이시는 "Manufacturer" 의 값이 아래의 "Application Folder"의 이름이 되는것이라고 저는 보고 있습니다. 경로를 설정하실때 이름을 입력을 해 놓는것이 좋다는 생각입니다. 보통 새롭게 프로젝트를 만들고 "Application Folder" 속성에 "DefaultLocation" 정보가 보이게 됩니다. 이곳의 정보를 수정하면은 변경을 할수 있습니다. // [ProgramFilesFolder] :: 설치할 경로 // [Manufacturer] :: 필수 유지 위에서 설명함. // [ProductName] :: 설치할 폴더명(프로젝트 이름과 달리 할수 있음) [ProgramFilesFolder][Manufacturer]\[ProductName] 위에서 "[ProgramFilesFolder]" 이부분을 변경을 원합니다. 저는 C 드라이버에 사용되기를 원해서 "[WindowsVolume][Manufacturer]\MyPROGRAM"으로 변경해서 모두 설치를 하고 있습니다. 저 처름…
Read More
MySQL DB Schema 관리 프로그램

MySQL DB Schema 관리 프로그램

CSharp, 프로그램
MySQL DB Schema 에 대해서 DBTool을 이용하지 않고 보고 보고서를 Excel로 출력하기 위해서 만들었습니다. 분명히 좋은 프로그램도 많고 하지만 특정 사용인에 맞춰서 출력을 조절하고 DB Schema를 관리 하기 위해서 만들게 되었습니다. 컬럼마다 코멘트와 형식으로 모두 설정이 가능하도록 되어 있어서 여러사람이 이 프로그램을 사용하면은 볼수가 있습니다.
Read More