۱۳۸۹/۰۸/۳۰

تغييرات دسترسي به كدها در دات نت 4


دو پروژه‌ي سورس باز XML RPC و Log4Net براي اجرا شدن در برنامه‌هاي دات نت 4 نياز به اندكي تغيير در هر دو برنامه‌ي فراخوان و اسمبلي‌هاي آن‌ها دارند كه در ادامه توضيحات مربوطه ارائه خواهند شد.

اگر يك پروژه‌ي جديد دات نت 4 را آغاز كنيد و سپس ارجاعي را به يكي از اسمبلي‌هاي ذكر شده اضافه نمائيد، اولين خطايي را كه حين استفاده مشاهده خواهيد نمود، مورد زير است:
Could not resolve assembly "System.Web".
The assembly is not in the currently targeted framework ".NETFramework,Version=v4.0,Profile=Client".
Please remove references to assemblies not in the targeted framework or consider retargeting your project.
علت هم اينجا است كه در تنظيمات پروژه‌ها‌ي جديد مبتني بر دات نت 4، پيش فرض Target framework انتخابي توسط VS.NET 2010 از نوع Client profile است؛ كه صرفا جهت كاهش حجم دات نت فريم ورك مورد نياز اين نوع برنامه‌ها طراحي شده است. در اين پروفايل ساده شده، اسمبلي System.Web وجود ندارد. بنابراين جهت استفاده از كتابخانه‌هاي XML RPC و يا Log4Net نياز است تا در خواص پروژه، Target framework را بر روي دات نت فريم ورك 4 كامل قرار داد تا خطاي فوق برطرف شود.

خطاي دومي كه حين كار با كتابخانه‌هاي XML RPC و يا Log4Net در يك برنامه‌ي دات نت 4 حتما با آن مواجه خواهيد شد در ادامه ذكر گرديده است:
Inheritance security rules violated while overriding member:
GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext),
Security accessibility of the overriding method must match the security accessibility of the method being overriden.
متد ISerializable.GetObjectData با ويژگي SecurityCritical در دات نت فريم ورك مزين شده است. با تغييرات امنيتي صورت گرفته در دات نت 4، متدي كه اين متد را تحريف مي‌كند نيز بايد با همان سطح دسترسي متد virtual اصلي معرفي گردد و گرنه برنامه اجرا نخواهد شد. البته اين مشكل ما نيست؛ مشكل سازندگان كتابخانه‌هاي ذكر شده است! ولي خوب تا اين لحظه براي مثال كتابخانه XML RPC براي دات نت 4 به روز نشده است ولي سورس كامل آن در دسترس است.
براي رفع اين مشكل ابتدا سورس اين كتابخانه‌ها را دريافت كرده و سپس در فايل AssemblyInfo.cs آن‌ها يك سطر زير را حذف نموده و پروژه را مجددا كامپايل كنيد:
[assembly: AllowPartiallyTrustedCallers]
علت وجود اين ويژگي‌ در كتابخانه‌هاي ذكر شده اين است كه بتوان از آن‌ها در محيط‌هاي اصطلاحا partially trusted (براي مثال هر برنامه‌اي كه در internet zone يا intranet zone اجرا مي‌شود) استفاده كرد. در دات نت 4 با تغييرات انجام شده معناي AllowPartiallyTrustedCallers به security-transparency تغيير كرده است. بنابراين با قيد آن يا بايد هر جايي كه متد GetObjectData ذكر شده در اين كتابخانه‌ها تحريف مي‌شود، ويژگي SecurityCritical را صريحا اعمال كرد يا اينكه مي‌توان AllowPartiallyTrustedCallers را حذف كرده و وظيفه‌ي انجام آن‌را به CLR محول نمود.


براي مطالعه بيشتر:
Using Libraries from Partially Trusted Code
Security Changes in the .NET Framework 4
TypeLoadException based on Security-Transparent Code, Level 2
Making log4net run on .NET 4.0