با سلام :
من افزونه ای که مدیر محترم کرامتی اعلام فرمودند را نصب کردم.
ولی یه ریزه گیج شدم.
زمانی که این افزونه نصب است چه اتفاقی در دات نت فریم ورک 4 (VS 2010) می افتد ؟
بدون نصب افزونه از چه کدهایی باید در PAGE_LOAD استفاده نماییم و با افزونه چطور؟
در لینک مورد نظر یه CONSOLE APP داشتیم که با دات نت فریم ورک 2 و 3.5 به خوبی در VS 2010 کار می کنه ، اما وفتی .NET FRAMEWORK رو به 4 تغییر می دیم در یک سری از خطوط ارور می دهد.(ارورها درکلاس PersianCultureHelper)
کد مورد نظر در پروژه پس از اعمال تغییرات در نام گذاری ها به صورت زیر شد :
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Globalization;
namespace PersianCulture
{
public static class PersianCultureHelper
{
//Represents a PropertyInfo that refer to ID of Calendar. The ID is private property of Calendar.
private static PropertyInfo calendarID;
//Represents a FieldInfo that refer to m_isReadOnly of CultureInfo. The m_isReadOnly is private filed of CultureInfo.
private static FieldInfo cultureInfoReadOnly;
//Represents a FieldInfo that refer to calendar of CultureInfo. The calendar is private filed of CultureInfo.
private static FieldInfo cultureInfoCalendar;
//Represents a FieldInfo that refer to isReadOnly of NumberFormatInfo. The isReadOnly is private filed of NumberFormatInfo.
private static FieldInfo numberFormatInfoReadOnly;
//Represents a FieldInfo that refer to m_isReadOnly of DateTimeFormatInfo. The m_isReadOnly is private filed of DateTimeFormatInfo.
private static FieldInfo dateTimeFormatInfoReadOnly;
//Represents a FieldInfo that refer to calendar of DateTimeFormatInfo. The calendar is private filed of DateTimeFormatInfo.
private static FieldInfo dateTimeFormatInfoCalendar;
//Represents a FieldInfo that refer to m_cultureTableRecord of DateTimeFormatInfo. The m_cultureTableRecord is private filed of DateTimeFormatInfo.
//private static FieldInfo dateTimeFormatInfoCultureTableRecord;
//Represents a MethodInfo that refer to UseCurrentCalendar of CultureTableRecord. The UseCurrentCalendar is private method of CultureTableRecord that the class is private too.
//private static MethodInfo cultureTableRecordUseCurrentCalendar;
/// <summary>
/// Represents static constructor
/// </summary>
static PersianCultureHelper()
{
calendarID = typeof(Calendar).GetProperty("ID", BindingFlags.NonPublic | BindingFlags.Instance);
cultureInfoReadOnly = typeof(CultureInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
cultureInfoCalendar = typeof(CultureInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
numberFormatInfoReadOnly = typeof(NumberFormatInfo).GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
dateTimeFormatInfoCalendar = typeof(DateTimeFormatInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
dateTimeFormatInfoReadOnly = typeof(DateTimeFormatInfo).GetField("m_isReadOnly" , BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
//dateTimeFormatInfoCultureTableRecord = typeof(DateTimeFormatInfo).GetField("m_cultureTabl eRecord", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
//Type cultureTableRecord = typeof(DateTimeFormatInfo).Assembly.GetType("Syste m.Globalization.CultureTableRecord");
//cultureTableRecordUseCurrentCalendar = cultureTableRecord.GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance);
}
/// <summary>
/// Represents a method that set PersianCalendar to specified instances of CultureInfo
/// </summary>
/// <param name="culture">Represents an instance of CultureInfo that persian number format should be set to it.</param>
public static void SetPersianOptions(CultureInfo farsicultureinfo)
{
SetPersianCalendar(farsicultureinfo, new DateTimeFormatInfo());
}
/// <summary>
/// Represents a method that set PersianCalendar to specified instances of CultureInfo and DateTimeFormatInfo
/// </summary>
/// <param name="culture">Represents an instance of CultureInfo that persian number format should be set to it.</param>
/// <param name="dateTimeFormat">Represents an instance of DateTimeFormatInfo that persian format should be set to it.</param>
public static void SetPersianCalendar(CultureInfo farsicultureinfo, DateTimeFormatInfo datetimeformatinfo)
{
if (farsicultureinfo == null || farsicultureinfo.LCID != 1065)
return;
PersianCalendar persiacalendar = new PersianCalendar();
bool readOnly = (bool)cultureInfoReadOnly.GetValue(farsicultureinf o);
if (readOnly)
{
cultureInfoReadOnly.SetValue(farsicultureinfo, false);
}
farsicultureinfo.DateTimeFormat = datetimeformatinfo;
InitPersianDateTimeFormat(datetimeformatinfo);
cultureInfoCalendar.SetValue(farsicultureinfo, persiacalendar);
InitPersianNumberFormat(farsicultureinfo);
if (readOnly)
{
cultureInfoReadOnly.SetValue(farsicultureinfo, true);
}
}
/// <summary>
/// Represents a method that set persian number format to specified instance CultureInfo.
/// </summary>
/// <param name="info">Represents an instance of CultureInfo that persian number format should be set to it.</param>
public static void InitPersianNumberFormat(CultureInfo farsicultureinfo)
{
InitPersianNumberFormat(farsicultureinfo.NumberFor mat);
}
/// <summary>
/// Represents a method that set persian number format to specified instance NumberFormatInfo.
/// </summary>
/// <param name="info">Represents an instance of NumberFormatInfo that persian option should be set to it.</param>
public static void InitPersianNumberFormat(NumberFormatInfo farsicultureinfoNumberFormatInfo)
{
if (farsicultureinfoNumberFormatInfo == null)
return;
bool readOnly = (bool)numberFormatInfoReadOnly.GetValue(farsicultu reinfoNumberFormatInfo);
if (readOnly)
{
numberFormatInfoReadOnly.SetValue(farsicultureinfo NumberFormatInfo, false);
}
farsicultureinfoNumberFormatInfo.NativeDigits = new string[] { "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩" };
farsicultureinfoNumberFormatInfo.CurrencyDecimalSe parator = "/";
farsicultureinfoNumberFormatInfo.CurrencySymbol = "ريال";
if (readOnly)
{
numberFormatInfoReadOnly.SetValue(farsicultureinfo NumberFormatInfo, true);
}
}
/// <summary>
/// Represents a method that set persian option to specified instance CultureInfo
/// </summary>
/// <param name="dateTimeFormat">Represents an instance of DateTimeFormatInfo that persian option should be set to it.</param>
public static void InitPersianDateTimeFormat(DateTimeFormatInfo datetimeformatinfo)
{
if (datetimeformatinfo == null)
return;
PersianCalendar persiacalendar = new PersianCalendar();
bool readOnly = (bool)dateTimeFormatInfoReadOnly.GetValue(datetime formatinfo);
if (readOnly)
{
dateTimeFormatInfoReadOnly.SetValue(datetimeformat info, false);
}
dateTimeFormatInfoCalendar.SetValue(datetimeformat info, persiacalendar);
//object obj2 = dateTimeFormatInfoCultureTableRecord.GetValue(info );
//cultureTableRecordUseCurrentCalendar.Invoke(obj2, new object[] { calendarID.GetValue(calendar, null) });
datetimeformatinfo.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
datetimeformatinfo.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
datetimeformatinfo.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
datetimeformatinfo.AbbreviatedMonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
datetimeformatinfo.MonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
datetimeformatinfo.AMDesignator = "ق.ظ";
datetimeformatinfo.PMDesignator = "ب.ظ";
datetimeformatinfo.FirstDayOfWeek = DayOfWeek.Saturday;
datetimeformatinfo.FullDateTimePattern = "yyyy, MMMM dddd, dd HH:mm:ss";
datetimeformatinfo.LongDatePattern = "yyyy , MMMM dddd , dd";//Change This Line Causes Problems
datetimeformatinfo.ShortDatePattern = "yyyy/MM/dd";
if (readOnly)
{
dateTimeFormatInfoReadOnly.SetValue(datetimeformat info, true);
}
}
}
}
واما خطوط دارای ارور :
//cultureTableRecordUseCurrentCalendar = cultureTableRecord.GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance);
---------------------------------------
//object obj2 = dateTimeFormatInfoCultureTableRecord.GetValue(info );
//cultureTableRecordUseCurrentCalendar.Invoke(obj2, new object[] { calendarID.GetValue(calendar, null) });
چگونه این ارورها را رفع نمایم؟
فکر می کنم این کدها در ارتباط با اسمبلی دات نت هستند که برای تحقیق درمورد آنها باید Reflector را در دات نت بررسی کرد.
واما کدی که در page_Load استفاده می کنم به صورت زیر است :
CultureInfo facultureinfo = new CultureInfo("fa-IR");
PersianCultureHelper.SetPersianOptions(faculturein fo);
Thread.CurrentThread.CurrentCulture = facultureinfo;
واین در حالتی ست که افزونه نصب است.
اگر راهنمایی بفرمایید ممنون می شوم
باتشکر
مجید داراب