برای این مهاجرت (ارتقا) باید ملاحظات زیادی را در نظر گرفته و دقت زیادی میکردم. چون حجم پروژهها و solutionها خیلی زیاد بود و وابستگیهای زیادی به هم داشتند و کمترین اشتباه دردسرهای زیادی را درست میکردند. خصوصا این که کل سورس با ملاحظات امنیتی مختلفی روی Source Safe قرار داشتند. مشکلاتی را که در انجام این کار با آنها برخورد کردهام را در ادامه خلاصه کردهام:
۱- Build Break: از آخرین Build بعضی از پروژهها وقت خیلی زیادی میگذشت و بعضی از آنها به دلیل تغییرات پروژههای دیگر build error پیدا کرده بودند. به خصوص پروژههای Initialization که همان اولها و با عجله نوشته شده و بعد از آن خیلی کم استفاده شده بودند. بنابراین باید کل پروژه را در همان نسخه ۲۰۰۵ یک بار به طور کامل build کنم تا در ۲۰۰۸ فقط build errorهای ناشی از به روز رسانی را داشته باشم نه چیز دیگر.
۲- تعلیق کلیه فعالیتهای توسعه و نگهداری: من سورس کد را از Source Safe گرفته بودم و میخواستم آن را در یک جای جدید VSS اضافه کنم بنابراین مجبور بودم به همه اعلام کنم تا پایان upgrade از هرگونه check in و check out خودداری و سورسهای خود را عوض نکنند چون بعدا مجبور میشوند آنها را به طور دستی در نسخه ۲۰۰۸ وارد کنند و این یعنی استرس کاری و کمبود وقت در پروسه کاری مهاجرت از ۲۰۰۵ به ۲۰۰۸.
۳- پروژههای تست: به خاطر مشکلی که در convert فایلهای .vsmdi و localtestrun.testrunconfig داشتم و به خاطر قدیمی بودن پروژههای تست و استفاده کمی که از آنها میشد تبدیل پروژههای تست را بیخیال شده و آنها را unload کردم (به همین سادگی!).
۴- تغییر NameSpaceها: در یک مورد خاص NameSpace یکی از datasetها به طور خود به خود تغییر پیدا کرده و عبارت .Entities به ته آن اضافه شده و این قضیه باعث شده بود که کل solution به دلیل عوض شدن این Name Space دچار build break شود. Name Space یک DataSet به طور خودکار از روی پروژه دربرگیرنده آن ساخته میشود و علی الظاهر روش ساخت این NameSpace در نسخههای ۲۰۰۵ و ۲۰۰۸ ویژوال استودیو با هم فرق کرده است. هر DataSet دارای دو NameSpace یکی برای خودش و دیگری برای اجزای آن است. این مشکل در مورد یکی از ریسورسها (.resx) که در فولدر Properties یکی از پروژهها بود هم اتفاق افتاده بود.
۵- جابجایی بعضی typeها و کلاسهای داخلی دات نت: این قضیه فقط یک بار اتفاق افتاده بود و آن هم جابجایی System.Data.TypeTableBase از اسمبلی System.Data به System.Data.DataSetExtensions است. این جابجایی منجر به اضافه کردن reference جدید میشود.
۶- عوض کردن Target Framework از .Net framework 2.0 به .Net framework 3.5: که خود این کار هم کار وقتگیری بود چون باید تک تک پروژهها را باز میکردم و این تنظیم را به طور دستی عوض میکردم. انجام این کار از طریق جستجو در فایلهای .csproj هم امکان پذیر نبود چون تا زمانی که این مقدار برابر .Net Framework 2.0 باشد تگ TargetFrameworkVersion به xml آن اضافه نمیشد.
۷- عوض کردن جداگانه پروژه گزارشات از نسخه ۲۰۰۵ به نسخه ۲۰۰۸: که خود حدیث مفصلی داشت. برای کسب اطلاع بیشتر از جزییات موضوع به وبلاگ حاجلو مراجعه کنید.
۸- مشکلات مصیبت بار web.config: همانطور که میدانید شماره نسخه خیلی از کلاسها و اسمبلیهای دات نت در web.config نگهداری میشود. در حالت عادی خود ویژوال استودیو تقریبا همه شماره نسخهها را به روز رسانی میکند ولی بعضی موارد هستند که به طور خودکار انجام نمیشوند و نیاز به دست کاری دستی دارند. قسمت بد این قضیه این است که بعضی از این موارد را نمیشود به این راحتی پیدا کرد و باید آنقدر مشکلات عجیب و غریب و لاینحل در برنامه دید و هزار تا منبع را بالا و پایین کرد تا منبع مشکل و راه حل آن پیدا شود. به عنوان مثال موردی که باعث شده بود یکی از صفحات خراب شده و واقعا گریه مرا درآورد، وجود عبارت xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0" در نود configuration بود. وجود این عبارت در نرم افزار مبتنی بر framework 3.5 ما باعث شده بود یکی از صفحات دچار خطای Unable to cast object of type ‘System.Web.Configuration.ScriptingScriptResourceHandlerSection’ to type ‘System.Web.Configuration.ScriptingScriptResourceHandlerSection’.شود.
۹- کنترلهای شخص ثالث: در بعضی صفحات وب از کنترلهایی غیر از کنترلهای مادرزاد دات نت استفاده شده است مثل کنترلهای شخصی شرکتها یا کنترل ReportViewer مایکروسافت. گاهی اوقات کد register این اسمبلی به جای web.config به طور مستقیم در همان صفحه وب (aspx,ascx) استفاده کننده قرار داده شدهاند. در حین به روز رسانی باید به این مشکل هم توجه شده و اگر شماره نسخه کنترلها عوض شده کد رجیستر هم به روز رسانی گردد. ما این مشکل را با کنترل مشاهده گزارشات MS SQL Reporting Services یعنی Microsoft.ReportViewer.WebForms داشتیم. چون نسخه آن را از 8.0.0.0 به 9.0.0.0 عوض نکرده و دچار مشکل Unable to load client print control شده بودیم. به این نوشته مسعود هم که در مورد همین مشکل است دقت کنید.
۱۰- ویرایش مخصوص framework 3.5 نرم افزارهای شخص ثالث: در حین این به روز رسانی بهتر است (بعضی وقتها اجباری است) که نسخه مخصوص framework 3.5 کامپوننتها و کتابخانههای متفرقه غیر مایکروسافتی به جای نسخه قبلی مورد استفاده قرار گیرد. مثل NHibernate و Enterprise Library.
۱۱- پیش فرضهای قدیمی: گاهی اوقات در حین به روز رسانیها، بعضی از پیش فرضهای سیستم یا نرم افزار جدید عوض شده و کار را خراب میکنند. باید مواظب این طور تغییرات بود. بعضی از این پیش فرضها عبارتند از: تغییر پیش فرض Call by Value و Call by Reference از VB6 به VB.Net که شهرت زیادی پیدا کرد، مقدار timeout در نسخههای جدیدتر Sql Server و…
پایان خوش: خوشبختانه تغییرات نسخه ۳٫۵ داتنت نسبت به نسخه ۲٫۰ چندان اساسی نبوده و بیشتر در حد توسعه Class Library بوده و این ارتقا تاثیر نامطلوبی روی کارکرد برنامه حداقل در طول دوره آزمایشی آن نداشته است.
پ. ن.: در مورد ۸ خطای The control with ID ‘cbeDeleteLastAACDocument’ requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it. را هم داشتیم که با برداشتن آن xmlns حل شد.
Comments
مطلب مرتبط: http://afsharm.blogspot.com/2009/12/migrating-to-dotnet-framework-35-and.html