티스토리 뷰

======================================================

 안녕하세요 Doridori 입니다.

글을 쓰기 전에 마지막에 어떤 생각들을 했는지 마지막에 쓴 글을 먼저 읽어 보는데 지난 시간에 도도하다에 .net에 대한 글을 작성 했을 때에 프로젝트를 마무리 하면서 신규 프로젝트를 함께 진행 하는 상태인데다 회사 생활적인 측면에서도 많은 일이 있어서 많이 혼란스러운 것 같은 느낌이 있네요. ㅜㅠ

지금은 새로운 출장지로 이동 해서 혼란스러운 부분들과는 살짝 떨어져 있을 수 있는 시기가 된 듯 합니다.

또한 새로운 환경에 적응 중이라 살짝은 설레이기도 하면서 호기심이 올라오고 있다고 말씀 드릴 수 있을 것 같습니다. 

이번 시기는 어떻게 흘러갈지 모르겠지만 주어진 시간들을 최대한 열심히 활용해서 즐거운 기억으로 남을 수 있도록 노력해봐야 할 것 같습니다.

제가 유튜브 댓글에 가장 많이쓰는 단어이기는 한데 사실은 저한테 하는 말이 아닐까 싶은 이야기가 있습니다. 

다들 파이팅 하십시오 ^^b

감사합니다. ^^

======================================================

 

72. DLL 생성 및 사용

Source UI)

72. DLL 생성 및 사용 (UI).zip
0.34MB

 

Soruce 전체) 

72. DLL 생성 및 사용 (Source, Library).zip
0.46MB

 

 

교재)

72. DLL 생성 및 사용.pdf
0.28MB

 

 지난번 도도하다에서 "소프트웨어 개발 프로젝트 진행 시 필요 문서"라는 장기 프로젝트를 마무리하자 마자 바로 내용이 길어지게 되었습니다. 

쉬어가는 느낌으로 DLL 사용을 리뷰 하려고 했는데 하다 보니 .net의 역사 > 정적링크라이브러리(LIB) vs 동적링크라이브러리 (DLL) > DLL의 사용 순서대로 진행 하게 되어 버렸습니다. ^^a

도도하다 쪽에서 .NET의 역사 부분도 보고 오시면 많이 도움이 되지 않을까 생각 합니다. 

2024.07.06 - [C#/도리도리 하고 싶은거 다해] - 도도하다) 23. Microsoft .NET의 역사

 

도도하다) 23. Microsoft .NET의 역사

======================================================안녕하세요 Doridori 입니다.드디어 3년간 집중 하던 프로젝트를 마무리 하였습니다. (물론 중간 중간에 다른 프로젝트들도 진행 하였습니다.)다음 프로젝

cwkcw.tistory.com

이번에는 Lib(Static Link Library)와 DLL(Dynamic Link Library)로 구분 되는 내용에 대한 개론 적인 부분을 다루고 이후 DLL을 추가 해서 개발해보는 실습으로 총 2강의로 진행 할 예정 입니다. 

목적은 LIB와 DLL의 구동 방식을 이해 한다고 하면 자연스럽게 흐름이나 장 단점들도 파악 할 수 있지 않나 생각 됩니다.

개발 하는 프로그램의 경우 단위 변환 하는 로직을 가지고 있는 DLL을 가지고 단위 변환 프로그래을 작성해보았습니다. 

강의)

1) 내용 설명 : DLL에 대한 개론 적인 부분 설명

 

2) 프로그램 개발 : .net으로 DLL 생성 및 응용 프로그램 개발

 

 

Source)

Source)

1. Library (DLL)

 - 라이브러리 소스 입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
namespace UnitConvertLibrary
{
    public class cUnitConvert
    {
        #region 길이 변환
        // 길이 변환 (Meter(미터), Kilometer(킬로미터), Mile(마일))
        public enum enLength
        {
            MeterToKilometer = 1,
            MeterToMile,
            KilometerToMeter = 11,
            KilometerToMile,
            MileToMeter = 21,
            MileToKilometer,
        }
 
        /// <summary>
        /// 길이 변환 Logic (Meter, Kilometer, Mile)
        /// </summary>
        /// <param name="changeType">변환 Type</param>
        /// <param name="value">변환 할 값</param>
        /// <returns></returns>
        public static double ConvertLength(enLength changeType, double value)
        {
 
            double result = 0;
 
            switch (changeType)
            {
                case enLength.MeterToKilometer:
                    result = value / 1000;
                    break;
                case enLength.MeterToMile:
                    result = value / 1609.34;
                    break;
                case enLength.KilometerToMeter:
                    result = value * 1000;
                    break;
                case enLength.KilometerToMile:
                    result = value * 0.621371;
                    break;
                case enLength.MileToMeter:
                    result = value * 1609.34;
                    break;
                case enLength.MileToKilometer:
                    result = value / 0.621371;
                    break;
                default:
                    break;
            }
 
            return result;
 
        }
        #endregion
 
 
        #region 무게 변환
        // 무게 변환 (Gram(그램), Kilogram(킬로그램), Pound(파운드))
        public enum enWeight
        {
            GramToKilogram = 1,
            GramToPound,
            KilogramToGram = 11,
            KilogramToPound,
            PoundToGram = 21,
            PoundToKilogram,
        }
 
 
        /// <summary>
        /// 무게 변환 Logic (Gram, Kilogram, Pound)
        /// </summary>
        /// <param name="changeType">변환 Type</param>
        /// <param name="value">변환 할 값</param>
        /// <returns></returns>
        public static double ConvertWeight(enWeight changeType, double value)
        {
            double result = 0;
 
            switch (changeType)
            {
                case enWeight.GramToKilogram:
                    result = value / 1000;
                    break;
                case enWeight.GramToPound:
                    result = value / 453.592;
                    break;
                case enWeight.KilogramToGram:
                    result = value * 1000;
                    break;
                case enWeight.KilogramToPound:
                    result = value * 2.20462;
                    break;
                case enWeight.PoundToGram:
                    result = value * 453.592;
                    break;
                case enWeight.PoundToKilogram:
                    result = value / 2.20462;
                    break;
                default:
                    break;
            }
 
            return result;
 
        }
        #endregion
 
 
        #region 온도 변환
        // 온도 변환 (Celsius(섭씨), Fahrenheit(화씨))
        public enum enTemperature
        {
            CelsiusToFahrenheit = 1,
            FahrenheitToCelsius,
        }
 
        /// <summary>
        /// 온도 변환 Logic (Celsius, Fahrenheit)
        /// </summary>
        /// <param name="changeType">변환 Type</param>
        /// <param name="value">변환 할 값</param>
        public static double ConvertTemperature(enTemperature changeType, double value)
        {
            double result = 0;
 
            switch (changeType)
            {
                case enTemperature.CelsiusToFahrenheit:
                    result = (value * 9 / 5+ 32;
                    break;
                case enTemperature.FahrenheitToCelsius:
                    result = (value - 32* 5 / 9;
                    break;
                default:
                    break;
            }
 
            return result;
 
        }
        #endregion
 
    }
}
cs

2. Main Source)

 - DLL을 추가해서 구성 한 Source 부분 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
using UnitConvertLibrary;
 
namespace UnitConverterApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
 
        #region Button Event
        /// <summary>
        /// Form Load Event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            rdoLength.Checked = true;
        }
 
        /// <summary>
        /// 변환 진행
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExecute_Click(object sender, EventArgs e)
        {
            double dValue = 0.0;
            double dResult = 0.0;
 
            if (!double.TryParse(tboxValue.Text, out dValue))
            {
                Log(enLogLevel.Error, $"Double 형태로 변환 할 수 없는 값 입니다. ({tboxValue.Text})");
                return;
            }
 
            if (rdoLength.Checked)
            {
                cUnitConvert.enLength eMethodType = fStringtoLength(cboxType.Text);
 
                dResult = cUnitConvert.ConvertLength(eMethodType, dValue);
            }
            else if (rdoWeight.Checked)
            {
                cUnitConvert.enWeight eMethodType = fStringtoWeight(cboxType.Text);
 
                dResult = cUnitConvert.ConvertWeight(eMethodType, dValue);
            }
            else if (rdoTemperature.Checked)
            {
                cUnitConvert.enTemperature eMethodType = fStringtoTemperature(cboxType.Text);
 
                dResult = cUnitConvert.ConvertTemperature(eMethodType, dValue);
            }
 
            tboxResult.Text = dResult.ToString("0.###");  // 소수 3자리 까지 자리수 지정
            Log(enLogLevel.Info_L1, $"{cboxType.Text} : 의 변환 결과는 기존[{tboxValue.Text}] > 변환[{tboxResult.Text}] 입니다.");
        }
 
        #endregion
 
 
        #region 길이 변환 관련 내용
        /// <summary>
        /// Radio Button Change
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rdoLength_CheckedChanged(object sender, EventArgs e)
        {
            cboxType.Items.Clear();
 
            foreach (cUnitConvert.enLength oMethodType in Enum.GetValues(typeof(cUnitConvert.enLength)))   // ※15강 캡슐화에서 사용
            {
                cboxType.Items.Add(oMethodType.ToString());
            }
            cboxType.SelectedIndex = 0;
            Log(enLogLevel.Info_L1, $"({cboxType.Text})을 선택 하였습니다.");
        }
 
        /// <summary>
        /// String to Enum 관련 Validation
        /// </summary>
        /// <param name="enType"></param>
        /// <returns></returns>
        private cUnitConvert.enLength fStringtoLength(string enType)
        {
            cUnitConvert.enLength eMethodType;
 
            if (!Enum.TryParse<cUnitConvert.enLength>(enType, out eMethodType))
            {
                Log(enLogLevel.Error, $"Combox에 없는 값은 사용 할 수 없음 ({enType})");
            }
 
            return eMethodType;
        }
 
        #endregion
 
 
        #region 무게 변환 관련 내용
        /// <summary>
        /// Radio Button Change
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rdoWeight_CheckedChanged(object sender, EventArgs e)
        {
            cboxType.Items.Clear();
 
            foreach (cUnitConvert.enWeight oMethodType in Enum.GetValues(typeof(cUnitConvert.enWeight)))   // ※15강 캡슐화에서 사용
            {
                cboxType.Items.Add(oMethodType.ToString());
            }
            cboxType.SelectedIndex = 0;
            Log(enLogLevel.Info_L1, $"({cboxType.Text})을 선택 하였습니다.");
        }
 
        /// <summary>
        /// String to Enum 관련 Validation
        /// </summary>
        /// <param name="enType"></param>
        /// <returns></returns>
        private cUnitConvert.enWeight fStringtoWeight(string enType)
        {
            cUnitConvert.enWeight eMethodType;
 
            if (!Enum.TryParse<cUnitConvert.enWeight>(enType, out eMethodType))
            {
                Log(enLogLevel.Error, $"Combox에 없는 값은 사용 할 수 없음 ({enType})");
            }
 
            return eMethodType;
        }
 
        #endregion
 
 
        #region 온도 변환 관련 내용
        /// <summary>
        /// Radio Button Change
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rdoTemperature_CheckedChanged(object sender, EventArgs e)
        {
            cboxType.Items.Clear();
 
            foreach (cUnitConvert.enTemperature oMethodType in Enum.GetValues(typeof(cUnitConvert.enTemperature)))   // ※15강 캡슐화에서 사용
            {
                cboxType.Items.Add(oMethodType.ToString());
            }
            cboxType.SelectedIndex = 0;
            Log(enLogLevel.Info_L1, $"({cboxType.Text})을 선택 하였습니다.");
        }
 
        /// <summary>
        /// String to Enum 관련 Validation
        /// </summary>
        /// <param name="enType"></param>
        /// <returns></returns>
        private cUnitConvert.enTemperature fStringtoTemperature(string enType)
        {
            cUnitConvert.enTemperature eMethodType;
 
            if (!Enum.TryParse<cUnitConvert.enTemperature>(enType, out eMethodType))
            {
                Log(enLogLevel.Error, $"Combox에 없는 값은 사용 할 수 없음 ({enType})");
            }
 
            return eMethodType;
        }
 
        #endregion
 
 
        #region Log Viewer  (기존 Source 재활용)
 
        int iMaxListCount = 12;
 
        // Log Level을 지정 할 Enum (44강 Tree View 참조)
        enum enLogLevel
        {
            Info_L1,
            Info_L2,
            Info_L3,
            Warning,
            Error,
        }
 
        private void Log(enLogLevel eLevel, string LogDesc)
        {
            this.Invoke(new Action(delegate ()
            {
                if (lboxLog.Items.Count >= iMaxListCount)
                {
                    lboxLog.Items.RemoveAt(iMaxListCount - 1);
                }
 
                DateTime dTime = DateTime.Now;
                string LogInfo = $"{dTime:yyyy-MM-dd hh:mm:ss.fff} [{eLevel.ToString()}] {LogDesc}";
                lboxLog.Items.Insert(0, LogInfo);
            }));
        }
 
        private void Log(DateTime dTime, enLogLevel eLevel, string LogDesc)
        {
            this.Invoke(new Action(delegate ()
            {
                if (lboxLog.Items.Count >= iMaxListCount)
                {
                    lboxLog.Items.RemoveAt(iMaxListCount - 1);
                }
 
                string LogInfo = $"{dTime:yyyy-MM-dd hh:mm:ss.fff} [{eLevel.ToString()}] {LogDesc}";
                lboxLog.Items.Insert(0, LogInfo);
            }));
        }
 
        #endregion
 
 
    }
}
cs

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함