متن صدای ویدیو :

اگر یادتان باشد در ویدیوهای قبلی درباره ی کامپایل DLL ها صحبت کردیم و گفتیم شما برای این که برنامه تان را بنویسید می توانید آن ها را به تعدادی لایه که هرکدام یک DLL هستند تبدیل کنید و برای آن ها کد بنویسید. مثلا الان لایه ی Model را انتخاب می کنم. راجع به این compile صحبت کردیم و گفتیم که compile دو حالت بدون ساخت وابستگی ها که همان حالت build در visual studio است و حالت با ساخت وابستگی ها که حالت rebuild در  visual studio است.

یعنی اگر DLL شما از DLL های compile نشده ی دیگری استفاده کرده باشد ، با ساخت وابستگی ، تمام آن DLL ها را برای شما compile می کند. اما غیر از compile ما یک قسمت دیگر داریم به اسم خطایابی یا debug که خود آن چند قسمت دارد:

اجرای خطایابی Breakpoint خودکار، Breakpoint visual studio و مدیریت خطایابی ها. اول اجرای خطایابی را برای شما توضیح می  دهم، که الان آن را اجرا می کنم. پیغام می دهد که تغییر پیدا نشد. این پیغام برای چیست؟ چون این platform الان با setup نصب شده است در نتیجه کدهایی که اینجا است در Source control ورژنی ندارد یعنی change set ندارد. در اصل این پیغامی که تغییری پیدا نشد منظور انگلیسی آن این است که change set برای این کدی که می خواهید دیباگ کنید پیدا نشد.

اما چرا زمان اجرای خطایابی به سراغ source control می رود و دنبال change set می گردد. ما پایین Editor ها که در کد نویسی سمت Client هم به همین صورت است. یک قسمت داریم که دکمه ای دارد به نام اعمال تغییرات بر روی فایل اصلی که منظور همان Check in یا check out است. وقتی که check in می کنیم علاوه بر این که در Source Control ذخیره می شود تغییرات آن روی فایل اصلی هم ذخیره می شود یعنی تا زمانی که از تغییرات کد مان مطمئن نباشیم که Stable است نباید آن را check in کنیم در فایل اصلی و فقط باید در سورس کنترل نگه داریم و اجرای خطایابی هم از روی آن کدی که می خواهیم خطایابی کنیم آن یک کد را از آخرین ورژن Source Control استفاده می کند.

توجه کنید کدی که ما داریم Debug می کنیم نه سایر کدها یعنی KS.dynamic.Model ، KS.Dynamic.Model.Base اینها را از روی ورژن stable استفاده می کند ولی این کدی که من آن را Debug می کنم در view جاری من است. این یک عدد را از داخل Source Control می آورد و این را از آنجا Debug می کند. برای این که این مشکل را حل کنم الان یک تغییر الکی می دهم و آن را ذخیره می کنم. این بار می بینید که پیغام درست به من داد. اجرای خطایابی یک فرق دیگر با compile دارد.

در compile ، DLL ساخته می شود، ذخیره می شود ولی در اجرای خطایابی DLL در یک مسیر موقت temp ساخته می شود و بعد از این که با موفقیت ساخته شد و خطایی نداشت از آنجا delete می شود. یعنی ورژن هم برای شما نمی خورد. این برای حالتی است که برنامه نویسی که برای شما کد می زند شما نمی خواهید دسترسی compile به او بدهید فقط می خواهید دسترسی اجرای خطایابی داشته باشد تا ببیند که خودش خطایی دارد یا خیر.

یک نکته ی دیگر که می خواهم در اینجا توضیح دهم و نکته ی ظریفی می باشد، اگر در KS.Dynamic.Model.Base نشانه های جایگذاری در کد پدر حواستان باشد، کافی است که مثلا در اینجا یک space بخورد، این را ذخیره می کنم و برمیگردم به خود DLL model دوباره در اینجا اجرای خطایابی را می زنم اینبار به ما پیغام می دهد که علامت @ نباید باشد در قسمت اول کد، یعنی کافی است که شما در قسمت نشانه ی کد گذاری مقداری اشتباه کنید این پیغام را می گیرید.

پس باید حواستان جمع باشد در این قسمت مبادا space یا چیز  دیگری خورده باشد. دوباره آن را ذخیره می کنم دوباره بر می گردم. خطایابی، اجرای خطایابی و می بینم که ok است. دوستان من در این قسمت Check in و check out  سورس کنترل را برای کدهای سمت client کدهای تحت مرورگر هم به شما نشان بدهم. الان از همین script مرکز خودکار باز می بینید که پایین ویرایشگر، اعمال تغییرات بر روی فایل اصلی وجود دارد. این یعنی Check in یعنی علاوه بر این که در فایل اصلی نوشته می شود در Source Control هم ذخیره میشود.

فرق  Source Control و فایل اصلی هم در اینجا ، مدیریت Bundle ها ، وقتی شما می خواهید یک Bundle را compile کنید این از فایل اصلی می رود ، از Source Control شما نمی رود. یعنی ممکن است شما یک کدی را تحت ویرایش دارید و کد را تغییر می دهید اما هنوز نسخه ی stable  نیست که بخواهم compile شود ولی برنامه نویس های دیگر مثلا کدشان آماده است و می خواهند compile کنند. با آن ورژن stable شما compile می شود نه آن ورژن که شما در Source Control تغییراتی را  روش انجام داده اید.

دقیقا مشابه همین کدهای سمت سرور و اعمال تغییرات بر روی فایل اصلی است. من الان Source Control را هم باز می کنم شما ببینید که در اینجا یک ورژن برای ما خورده است. این از این نکته، در قسمت خطایابی غیر از اجرای خطایابی سه آیتم دیگر هم وجود دارد. Breakpoint خودکار و Breakpoint visual studio و مدیریت خطایابی. 

زمانی که ما در visual studio کد می زنیم امکان Breakpoint داریم ما می توانیم در کدمان  Breakpoint بگذاریم و در حین اجرا  در آنجا کد را متوقف کنیم با ماوس روی یک متغیر برویم و مقدار آن را ببینیم یا حتی در run time مقدار متغیرمان را عوض کنیم یا اصلا با جابجا کردن Breakpoint در حین اجرا از روی اجرای چند خط کد بپریم و نگذاریم آن چند خط کد اجرا شود. اما حالا که داخل مرورگر داریم کد می زنیم ، چطوی می توانیم از اجرای Breakpoint استفاده کنیم؟ دو حالت وجود دارد یا ما داریم در حالت local کد می زنیم یا حالت Remote ، حالت local یعنی چه؟

یعنی ما سورس پلتفرم را در visual studio باز کرده ایم و F5 را زده ایم و وبسایت ما بالا آمده است به جای آدرس وبسایت در اینجا مثلا dotnetexprt.ir اینجا localhost هست و بعد در اینجا کدمان را می زنیم و حالا می خواهیم آن را Debug هم کنیم. در این حالت می توان از امکانات visual studio استفاده کرد به چه طریقی؟

از طریق Breakpoint visual studio یعنی هر کجای کدتان بخواهید Breakpoint اجرا شود در visual studio در این بغل کلیک می کنید و یک دایره ی قرمز رنگ می خورد. ولی اینجا ، هر کجا که بخواهیم اجرا شود با اشاره گر ماوس کلیک می کنیم و روی خطایابی و Breakpoint visual studio را می زنیم. به محض این که این کار را می کنید چند خط کد برای شما insert می شود که comment هم دارد. اولا می گوید که باید حتما KS.Core.dll را جزء وابستگی های DLL تان Reference کرده باشید، دوم این که حتما باید روی Mode Debug باشید که همان IF Debug visual studio است.

ما زمانی که در پلتفرم ، compile می کنیم در هر دو حالت برای همه DLL هایمان دو تا حالت ، compile می شود. هم Release و هم Debug ، حالا برای این که به شما نشان بدهم یک بار این را compile می کنم در مدیریت خروجی ها ، همانطور که مشاهده می کنید الان دو DLL برای من شناخته شده است. KS.Dynamic.Model.dll این قسمت که یکی است _R6 و _D6 که ورژن DLL است و _R و _D .

D مخفف Debug و R مخفف Release است. کد Debug و visual studio Release هستند. شما باید از این DLL Debug برای Breakpoint تان استفاده کنید. چطور باید این کار را انجام دهید؟ باید آن DLL که قابلیت انتشار دارد یعنی همان DLL UI تان را compile کنید و برای شما آن هم دو حالت دارد Release و Debug می سازد و اینجا DLL Debug تان را انتخاب کنید و انتشار را بزنید ، به محض این که انتشار را زدید حالت Debug برای شما فعال می شود.

سپس به طور مثال به آن صفحه یا url که می خواهید می روید و برنامه را اجرا می کنید و سر آن نقطه که می رسید آن نقطه ای که Breakpoint گذاشته اید visual studio بالا می آید و می بینید که breakpoint شما آنجا ایستاده است و می توانید کدتان را Debug کنید. در اینجا قصد عملی نشان دادن شان را ندارم چون ویدیوهای تور و آشنایی هستند. انشاءالله در ویدیوهای بعدی و ویدیوهای عملی آموزش مان به طور مفصل برایتان توضیح می دهم ، حالا بر می گردم دوباره به همان کد خودم.

پس روش کار به این صورت شد که هرکجا که می خواهیم Breakpoint visual studio را می گذاریم بعد Check in می کنیم. اعمال تغییرات روی فایل اصلی ذخیره را می زنیم سپس compile می کنیم و بعد Debug آن را باید publish کنیم. Debug هم اول باید DLL UI که قابلیت انتشار دارد را کامپایل کنیم و Debug آن را که انتشار دهیم اتوماتیک Debug آن وصل است و reference شده به model ، که در اصل ما باید این کار را انجام دهیم که این DLL UI ما است، می بینیم که در وابستگی هایش که الان در اینجا موجود نیست ولی آن DLL که شما می خواهید را خودتان باید آن را reference کنید به این ، که publish آن اتفاق بیفتد یعنی باید لایه model و business به لایه ی UI شما وصل باشد برای Debug کردن. این از حالت localhost بود. اما فرض کنید که ما سایت را publish کرده ایم و روی سرور اصلی قرار گرفته مانند اینجا dotnetexpert.ir را و اصلا به هیچ عنوان باvisual studio در دسترس نیست. در اینجا حالا در هر قسمتی که می خواهید Breakpoint بگذارید می آییم و این دفعه breakpoint خودکار را قرار می دهیم.

باز هم یک سری کد برای ما وارد می کند که comment هم دارد اول این که باز KS.core.dll حتما reference شده باشد به DLL ما و نکته ی دوم این که حتما باید mode Debug باشیم و نکته ی سوم که در breakpoint visual studio هم بود و من فراموش کردم که بگویم این که ما باید در Debug mode باشیم یعنی چه؟

اگر یادتان باشد در برنامه نویسی client توضیح دادم زمانی که می خواهیم به حالت Debug وارد برنامه شویم در فرم log in چند بار کلیک می کردیم و در قسمت پایین دکمه ی حالت Debug برای ما فعال می شد انتخاب می کردیم و وارد می شدیم. حالا برای این که به شما نشان بدهم که یک یادآوری شود، من یک بار از سیستم خارج می شود در اینجا در فرم login اگر چندبار وسط فرم کلیک کنیم حالت Debug فعال می شود و من اگر این را روشن کنم می تواند با حالت Debug وارد شوم. پس هم باید DLL  با حالت Debug ساخته شده باشد هم برنامه نویس در حالت Debug وارد برنامه شده باشد تا بتواند کدهای Debug آن اجرا شود. اولین کاری که شما می کنید باید debugger تان را New کنید.

یعنی این خط کد debugger شما را New می کند وقتی debugger تان New شد سه کار می توانید انجام دهید. این سه کار در اینجا مشخص شده است و با comment جدا کنید. اول این که یک مقدار Object را log کنید. حالا این object هرچیزی می تواند باشد Complex object باشد، یک عدد باشد، یک رشته باشد. این کار را چگونه انجام می دهید؟

وقتی debugger را New کردید گزینه ای دارد به اسم AddOrUpdateDebuginfo. این متد خود به عنوان یک پارامتر ورودی یک Debug info می گیرد که سه ورودی دارد یک Cod ID این Cod ID  با مقدار 952 خود یک ID کدی است که می خواهید Debug کنید. به صورت دستی باید آن را وارد کنید ولی به طور پیش فرض برای شما به طور اتوماتیک وارد می شود ، Data در اصل یک مقدار رشته ای است که شما از هر object که می خواهید مقدار آن را ذخیره کنید هم می تواند عدد باشد هم complex object باشد یا رشته باشد هر چیزی می تواند باشد.

یک متد SerializeObjectToString دارد که هر object را که شما بخواهید تبدیل به string می کند که بعدا بتوانید مقدارش را ببینید یا Integer value و یک asCodePath هم هست که باید به صورت ثابت این رشته را به آن بدهید تا debugger تان درست کار کند. این مقدار که ذخیره شد بعدا شما کجا می توانید آن را ببینید؟

در قسمت خطایابی، مدیریت خطایابی ها وقتی آن مقدار در runtime ذخیره شد می توانیم آن مقدار را در قسمت اطلاعات مثلا data که ذخیره شده ببینید. اما غیر از آن data و عدد صحیحی که دیدید آنجا ذخیره شد شما چند چیز دیگر می توانید ذخیره کنید. یک مقدار Boolean است و عدد صحیح را که دیدیم، عدد اعشار و تاریخ و ساعت و اطلاعات که همان data است. شما اینها را هم می توانید ذخیره کنید و مقدار  آن را ببینید. پس اولین حالت این بود که ما می خواهیم در یک جایی Debug بگذاریم و مقدار متغیر یا خروجی method مان را ببینیم که چه چیزی است.

حالت دوم این است که یک Debug را با Debug Id بخوانیم و آن یک مقداری که خواندیم با آن یک کاری کنیم. مثلا فرض کنیم که من یک مدیریت خطایابی جدید می زنم و در اینجا مثلا قک مقدار true را می خواهم پاس بدهم به داخل کد من این را که ذخیره کنم این به عنوان یک DebugInfo ذخیره می شود با ID 1 ، کافی است که به جای AddDebuggingInfo  ، بزنم Id برابر با 1 ، بگویم که مقدار 1 را بیاور و بعد Boolean آن را برایم بخوان اگر آن Boolean  برابر با true بود یا این خط کدها را اجرا کن اگر این Boolean  برابر با false بود بیا و یک سری کد دیگر را اجرا کن.

این یک روش است و یک روش دیگر هست شما مقدار true را بریزید در یک مقدار متغیر یا اصلا آن مقدار متغیر را عوض کنید با آن اطلاعاتی که آمده است آن رشته یا آن تاریخ و ساعت. هر کاری با Breakpoint در visual studio بتوانید انجام دهید در اینجا هم می توانید انجام دهید. پس من یک بار دیگر می گویم می رویم به مدیریت خطایابی و اول یک متغیر می سازم بعد می خواهم در runtime این متغیر  را Check کنم بگویم اگر برابر با true بود بار اول این خط کدها اجرا نشود بعد true را false کن تا از دفعات بعد آن خط کد هم اجرا شود. اینها کارهایی هستند که برنامه نویسان در visual studio با Breakpoint انجام می دهند. 

یک حالت سومی هم دارد که شما می  توانید تمام Debug هایی که مرتبط با یک کد است مثلا در اینجا Cod ID 952 همه ی Debug ها را بگیرید و روی آنها linq بزنید ، مثلا در این جا گفته که Integer value=1 است. آن را برای من بگیر ، حالا مثلا چک کنید که Boolean ، true هست یا false. مثلا اگر true بود یک کاری انجام دهید اگر false بود یک کار دیگر بکن. این ها کارهایی هستند که برنامه نویسان در Debug با Breakpoint انجام می دهند. 

پس این هم حالت سوم بود. باز هم وقتی Breakpoint را اضافه کردید ، اعمال تغییرات روی فایل اصلی را زدید و ذخیره کردید سپس باید DLL تان را compile کنید باز این هم باید در mode Debug حتما انتشار پیدا کند و شما بتوانید از این Breakpoint هم استفاده کنید. وقتی هم که انتشار پیدا کرد، انتشار هم باز همان حالتی که UI تان باید در حالت Debug منتشر شود بعد باید در حالت Debug وارد سایت شوید، بروید در آن صفحه و آن دکمه یا Request که لازم است باید بزنید بفرستید تا کدتان اجرا شود. این دفعه دیگر visual studio نیست که بالا بیاید و اتفاق خاصی نمی افتد و کد شما اجرا می شود.

سپس باید برگردید اینجا در قسمت خطایابی مدیریت خطایابی را بزنید آن اطلاعاتی که خواستید ذخیره شود در اینجا به عنوان یک لیست به شما نشان می دهد و شما می توانید آن اطلاعات را بخوانید. مثلا خواستید مقدار یک متغیری در Runtime چند بوده true بوده یا false ، عدد آن چند شده بود؟

در اینجا اطلاعات برای شما می آید و شما می توانید از آن اطلاعات استفاده کنید و نکته ی آخر این که ما در اینجا یک گزینه ای داریم به اسم در حال ویرایش که در تمام کدهای مدیریت کدهای ما هست، چه در سمت server چه در سمت client چه در Database یا در صفحات مان این را داریم در حال ویرایش این همان Check out است. یعنی اگر شما این را روشن کنید و ذخیره کنید دیگر کسی نمی تواند غیر از خود شما یا admin کد شما را تغییر دهد این حالت check out است و DLL هم compile نمی شود.

در این حالت یعنی شما اعلام می کنید که DLL نباید الان compile شود. یک کد حیاتی در حال تغییر است جلوی بقیه را هم بگیرید از این که کس دیگری یا برنامه نویس دیگری بخواهد کد شما را هرچند که دسترسی به آن داشته باشد بخواهد عوض کند. تنها راه این است که خودتان از حالت Check out در بیاورید یا admin وبسایتتان.