نصاب سریع آن برای ASP.NET MVC
مقالات مرتبط با آن در سایت
- روش سوم آن، مراجعه به لاگهای ویندوز است: Computer management -> Event viewer
این نگارش بر روی سیستم من مشکلی نداشت ولی پس از چند گزارش عدم امکان اجرای آن بر روی سایر سیستمها، یک ماشین مجازی ویندوز 8.1 را تهیه و برنامه را بر روی آن اجرا کردم. بله ... برنامه هنوز به مرحلهی نمایش نرسیده، محو میشد. در این مرحلهی ابتدایی امکان تهیهی لاگ استثنای حاصل توسط برنامه وجود نداشت و تنها این خطا در event viewer ویندوز (Computer management -> event viewer -> windows logs -> application) قابل مشاهده بود:
Application: DNTProfiler.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.Windows.Markup.XamlParseException Stack: at System.Windows.Markup.WpfXamlLoader.Load
روش حل این نوع مشکلات و بررسی آنها در خارج از VS.NET، با استفاده از برنامهی معروف WinDBG مایکروسافت میسر است.
دو نگارش 32 بیتی و 64 بیتی آنرا از اینجا میتوانید دریافت کنید:
http://codemachine.com/downloads.html
پس از دریافت، بهتر است نسخهی 32 بیتی آنرا اجرا کنید، زیرا برای دیباگ برنامههای دات نت این نسخه است که امکان بارگذاری فایل C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll را دارد.
تا اینجا فرض بر این است که نسخهی 32 بیتی windbg را دریافت و اجرا کردهاید. در ادامه از منوی File آن گزینهی Open executable را انتخاب کرده و فایل exe برنامه را به آن معرفی کنید.
CommandLine: C:\Tests\DNTProfiler.1.0.808.0\DNTProfiler.exe Symbol search path is: srv* Executable search path is: ModLoad: 00150000 00176000 DNTProfiler.exe ModLoad: 76f30000 77098000 ntdll.dll ModLoad: 72ee0000 72f36000 C:\Windows\SysWOW64\MSCOREE.DLL ModLoad: 74be0000 74d20000 C:\Windows\SysWOW64\KERNEL32.dll ModLoad: 756e0000 757af000 C:\Windows\SysWOW64\KERNELBASE.dll (684.764): Break instruction exception - code 80000003 (first chance) eax=00000000 ebx=00000000 ecx=37af0000 edx=00000000 esi=7eb8f000 edi=00000000 eip=76fe2d15 esp=002ff604 ebp=002ff630 iopl=0 nv up ei pl zr na pe nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246 *** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - ntdll!LdrResolveDelayLoadsFromDll+0xa89: 76fe2d15 cc int 3
0:000> g ModLoad: 757b0000 75827000 C:\Windows\SysWOW64\ADVAPI32.dll ModLoad: 05080000 05102000 Newtonsoft.Json.dll (684.764): C++ EH exception - code e06d7363 (first chance) (684.764): C++ EH exception - code e06d7363 (first chance) (684.764): C++ EH exception - code e06d7363 (first chance) (684.764): CLR exception - code e0434352 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=002fd0a0 ebx=00000005 ecx=00000005 edx=00000000 esi=002fd164 edi=00000001 eip=756f3d67 esp=002fd0a0 ebp=002fd0f8 iopl=0 nv up ei pl nz ac pe nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00200216 *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SysWOW64\KERNELBASE.dll - KERNELBASE!RaiseException+0x48: 756f3d67 8b4c2454 mov ecx,dword ptr [esp+54h] ss:002b:002fd0f4=3fce1188
0:000> sxe clr 0:000> g (684.764): C++ EH exception - code e06d7363 (first chance) (684.764): CLR exception - code e0434352 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=002fe2a0 ebx=00000005 ecx=00000005 edx=00000000 esi=002fe368 edi=00000001 eip=756f3d67 esp=002fe2a0 ebp=002fe2fc iopl=0 nv up ei pl nz ac pe nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00200216 KERNELBASE!RaiseException+0x48: 756f3d67 8b4c2454 mov ecx,dword ptr [esp+54h] ss:002b:002fe2f4=3fce2388
اکنون میخواهیم پیام استثنای واقعی دات نت را مشاهده کنیم. به همین جهت ابتدا دستور loadby sos clr! و سپس دستور CLRStack! را صادر میکنیم:
0:000> !loadby sos clr 0:000> !CLRStack *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll - PDB symbol for clr.dll not loaded OS Thread Id: 0x764 (0) Child SP IP Call Site 002fe3f4 756f3d67 [GCFrame: 002fe3f4] 002fe430 756f3d67 [GCFrame: 002fe430] 002fe528 756f3d67 [GCFrame: 002fe528] 002fe544 756f3d67 [HelperMethodFrame_2OBJ: 002fe544] System.RuntimeTypeHandle.CreateInstance(System.RuntimeType, Boolean, Boolean, Boolean ByRef, System.RuntimeMethodHandleInternal ByRef, Boolean ByRef) DNTProfiler.App.Main() 002ff190 720e2652 [GCFrame: 002ff190]
0:000> !PrintException Exception object: 021e6f0c Exception type: System.Reflection.TargetInvocationException Message: Exception has been thrown by the target of an invocation. InnerException: System.IO.FileNotFoundException, Use !PrintException 021e6950 to see more. StackTrace (generated): <none> StackTraceString: <none> HResult: 80131604 0:000> !PrintException 021e6950 Exception object: 021e6950 Exception type: System.IO.FileNotFoundException Message: Could not load file or assembly 'System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. InnerException: <none> StackTrace (generated): SP IP Function 00000000 00000001 DNTProfiler!DNTProfiler.Services.SelfHostConfig.getHostConfiguration(System.String, Boolean)+0x2 002FE298 006B4E54 DNTProfiler!DNTProfiler.Services.SelfHostConfig.OpenWait(System.String, Boolean)+0x14 002FE2B0 006B4A3F DNTProfiler!DNTProfiler.ViewModels.MainWindowViewModel.doStart(System.String)+0x1f 002FE2C0 006B368D DNTProfiler!DNTProfiler.ViewModels.MainWindowViewModel..ctor(DNTProfiler.Common.Mvvm.ICommonDialogsService, DNTProfiler.Common.Controls.DialogManagement.Contracts.IDialogManager)+0xcd 002FE2D8 006B04C9 DNTProfiler!DNTProfiler.MainWindow..ctor()+0x91 StackTraceString: <none> HResult: 80070002
روش حل این مشکل، مراجعه به خواص پروژه، یافتن اسمبلی System.Net.Http.Formatting در لیست ارجاعات برنامه و سپس true کردن خاصیت copy to local آن است. به این ترتیب این اسمبلی در کنار فایل اجرایی برنامه کپی خواهد شد.
بنابراین خلاصهی عملیات یافتن علت اصلی کرش برنامه در خارج از ویژوال استودیو به صورت ذیل است:
الف) اجرای نسخهی 32 بیتی برنامهی windbg
ب) انتخاب منوی File آن و سپس باز کردن فایل اجرایی برنامه توسط گزینهی Open executable
ج) اجرای دستورات ذیل به ترتیب:
0:000> g 0:000> sxe clr 0:000> g 0:000> !loadby sos clr 0:000> !CLRStack 0:000> !PrintException
چند نمونهی مشابه برای مطالعهی بیشتر
Finding CLR exceptions without visual studio
Power of WinDBG: The story of mysterious crash of WPF application
Boolran Microsoft.TeamFoundation.VersionCpntrol.Client.Workspace.OwnerNameMatches(System.String)
خلاصه برای حل مشکل راهی جز آنیستال پچ که باز مشکل حل نشد و آخر مجبور شدم اول سرویس پک و بعد خود ویژوال استودیو رو اونطور که توصیه شده بود آنیستال و اینستال کنم. من بشخصه از SVN برای نگهداری کدها استفاده میکنم.
لینکهای هفته دوم دی
وبلاگها ، سایتها و مقالات ایرانی (داخل و خارج از ایران)
- شیوهنامه فارسیپسند گوگلخوان، نسخه ۰.۱.۱ (کار جالبی است. آشنایی با افزونه استایلیش)
ASP. Net
طراحی و توسعه وب
PHP
اسکیوال سرور
سی شارپ
SharePoint
عمومی دات نت
ویندوز
مسایل اجتماعی و انسانی برنامه نویسی
متفرقه
- آشنایی با لولههای یاهو و همچنین نمونهای دیگر
EF Code First #15
-
ابتدا نسخه آزمایشی dotconnect for oracle 8.2 professional را از این آدرس دریافت و آن را نصب میکنیم.
- نصب آخرین نسخه Entity Framework از طریق پاور شل نیوگت.
- افزودن Devart.Data و Devart.Data.Oracle و Devart.Data.Oracle.Entity به Solution.
- حذف تگ defaultConnectionFactory در entityFramework.
- افزودن تگ زیر در قسمت providers همانند کد زیر:
<provider invariantName="Devart.Data.Oracle" type="Devart.Data.Oracle.Entity.OracleEntityProviderServices, Devart.Data.Oracle.Entity, Version=8.2.100.6, Culture=neutral, PublicKeyToken=09af7300eec23701" />
MSBuild
private static void TestMSBuild(string projectFullPath) { var pc = new ProjectCollection(); var globalProperties = new Dictionary<string, string>() { { "Configuration", "Debug" }, { "Platform", "AnyCPU" } }; var buidlRequest = new BuildRequestData(projectFullPath, globalProperties, null, new string[] { "Build" }, null); var buildResult = BuildManager.DefaultBuildManager.Build(new BuildParameters(pc), buidlRequest); }
private static void TestMSBuild1(string projectPath) { var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"); if (regKey == null) return; var msBuildExeFilePath = Path.Combine(regKey.GetValue("MSBuildToolsPath").ToString(), "MSBuild.exe"); var startInfo = new ProcessStartInfo { FileName = msBuildExeFilePath, Arguments = projectPath, WindowStyle = ProcessWindowStyle.Hidden }; var process = Process.Start(startInfo); process.WaitForExit(); }
تنظیمات مورد نیاز جهت شروع به کار با C# 9.0
کمپین ضد IF !
سؤال : آیا refactoring صورت گرفته در مطلب فوق از نوع تزریق وابستگیها (dependency injection) بود؟
پاسخ: خیر.
پیاده سازی الگوی تزریق وابستگیها زمانی معنا پیدا میکند که شما حداقل 2 کلاس داشته باشید (مطلب فوق با یک کلاس شروع شد)، همچنین این دو کلاس ارجاعی به یکدیگر داشته باشند و اصطلاحا به هم گره خورده باشند.
سؤال : چگونه در یک پروژه بزرگ میتوان نیاز به پیاده سازی الگوی تزریق وابستگیها را تشخیص داد؟
پاسخ:
آیا نسخهی ultimate ویژوال استودیوی 2010 بر روی سیستم شما نصب است؟
اگر بله: (نصب است)
برای نمونه به مطلب Discovering Circular References مراجعه کنید.
اگر خیر: (نصب نیست)
در این حالت از ابزار رایگانی به نام .NET Architecture Checker میتوانید استفاده کنید. همان نمودارهای نسخهی ultimate ویژوال استودیو را برای شما ترسیم خواهد کرد.
سؤال : آیا میتوان از کتابخانههای تزریق وابستگیها و فریم ورکهای مرتبط، جهت مدیریت سادهتر قسمت آخر مطلب فوق یعنی تامین پیاده سازیهای اینترفیسهایی که قرار است در زمان اجرا استفاده شوند، کمک گرفت؟
پاسخ: بله.
این مورد یکی از کاربردهای متداول این ابزارها است (برای مثال ساخت برنامههای افزونه پذیر و همچنین سادهتر کردن Object composition و وهله سازیهای مرتبط) و ... این مورد را نباید با اصل refactoring صورت گرفته در مثال جاری اشتباه گرفت.
چند روز پیش تصمیم گرفتم از ASP.NET FriendlyUrls برای سفارشی کردن Urlهای سایت استفاده کنم
وقتی در لوکال تست میکردم همه چیز درست بود و بدون مشکل کار میکرد اما به محض اینکه سایت رو روی سرور Publish کردم و قصد پیمایش بین صفحات رو داشتم، با کلیک بر روی منوها با خطا 404 not found مواجه میشدم!
پس از کمی بررسی متوجه شدم که باید اسمبلی System.Web.Optimization.dll رو به وب سایت اد کنم و چند خط کد به web.config سایت اضافه کنم.
1- برای اضافه کردن System.Web.Optimization.dll به سایت روی References کلیک راست کنید و گزینه Manage Nuget Packages رو انتخاب کنید و سپس با جستجوی عبارت optimize از آیتمهای پیدا شده Microsoft ASP.NET Web Optimization Framework رو نصب کنید.
2- خطوط زیر رو به web.config سایت اضافه کنید
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <remove name="BundleModule" /> <add name="BundleModule" type="System.Web.Optimization.BundleModule" /> </modules> </system.webServer>
با این تغییرات ایراد ASP.NET FriendlyUrls برطرف شد