CultureAndRegionInfoBuilder builder = new CultureAndRegionInfoBuilder(culrureName, CultureAndRegionModifiers.Replacement);
CultureInfo c = new CultureInfo(culrureName);
List
PersianCalendar persianCalendar = new PersianCalendar();
list.Add(persianCalendar);
list.AddRange(c.OptionalCalendars);
builder.AvailableCalendars = list.ToArray();
DateTimeFormatInfo info = builder.GregorianDateTimeFormat;
//itPersianDateTimeFormat(info);
builder.GetType().GetField("m_defaultCalendar", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(builder, persianCalendar);
builder.Register();
the exception is:
NotSupportedException:Custom calendars are not currently supported.
i search all the internet and i can find one article that say it is because of domain safety check . anyone can help me to solve it?
Amrollah NeamatiPosted Feb 22, 2010, 2:18 AM
.Net Version: .Net 2.0
Project Type:Windows Console Application
my Complete Source Code of Program.cs is:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Threading;
using System.Reflection;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string culrureName = "fa-Ir";
try
{
CultureAndRegionInfoBuilder.Unregister(culrureName);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
CultureAndRegionInfoBuilder builder = new CultureAndRegionInfoBuilder(culrureName, CultureAndRegionModifiers.Replacement);
CultureInfo c = new CultureInfo(culrureName);
List
PersianCalendar persianCalendar = new PersianCalendar();
list.Add(persianCalendar);
list.AddRange(c.OptionalCalendars);
builder.AvailableCalendars = list.ToArray();
DateTimeFormatInfo info = builder.GregorianDateTimeFormat;
InitPersianDateTimeFormat(info);
builder.GetType().GetField("m_defaultCalendar", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(builder, persianCalendar);
builder.Register();
}
private static void SetPersianOptions()
{
SetPersianOptions(CultureInfo.CurrentCulture);
SetPersianOptions(CultureInfo.CurrentUICulture);
SetPersianOptions(CultureInfo.InvariantCulture);
SetPersianOptions(Thread.CurrentThread.CurrentCulture);
SetPersianOptions(Thread.CurrentThread.CurrentUICulture);
InitPersianDateTimeFormat(DateTimeFormatInfo.InvariantInfo);
InitPersianDateTimeFormat(DateTimeFormatInfo.CurrentInfo);
}
private static void SetPersianOptions(CultureInfo culture)
{
SetPersianCalendar(culture, new DateTimeFormatInfo());
InitPersianDateTimeFormat(culture.DateTimeFormat);
}
private static void SetPersianCalendar(CultureInfo culture, DateTimeFormatInfo dateTimeFormat)
{
PersianCalendar calendar = new PersianCalendar();
bool readOnly = (bool)typeof(CultureInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).GetValue(culture);
if (readOnly)
{
typeof(CultureInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetValue(culture, false);
}
culture.DateTimeFormat = dateTimeFormat;
InitPersianDateTimeFormat(dateTimeFormat);
typeof(CultureInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetValue(culture, calendar);
typeof(CultureInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetValue(culture, calendar);
if (readOnly)
{
typeof(CultureInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetValue(culture, true);
}
}
private static void InitPersianDateTimeFormat(DateTimeFormatInfo dateTimeFormat)
{
PersianCalendar calendar = new PersianCalendar();
bool readOnly = (bool)typeof(DateTimeFormatInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).GetValue(dateTimeFormat);
if (readOnly)
{
typeof(DateTimeFormatInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetValue(dateTimeFormat, false);
}
dateTimeFormat.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetValue(dateTimeFormat, calendar);
object obj2 = typeof(DateTimeFormatInfo).GetField("m_cultureTableRecord", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).GetValue(dateTimeFormat);
obj2.GetType().GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(obj2, new object[] { calendar.GetType().GetProperty("ID", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(calendar, null) });
dateTimeFormat.AbbreviatedDayNames = new string[] { "?", "?", "?", "?", "?", "?", "?" };
dateTimeFormat.ShortestDayNames = new string[] { "?", "?", "?", "?", "?", "?", "?" };
dateTimeFormat.DayNames = new string[] { "??????", "??????", "??????", "????????", "???????", "????", "????" };
dateTimeFormat.AbbreviatedMonthNames = new string[] { "???????", "????????", "?????", "???", "?????", "??????", "???", "????", "???", "??", "????", "?????", "" };
dateTimeFormat.MonthNames = new string[] { "???????", "????????", "?????", "???", "?????", "??????", "???", "????", "???", "??", "????", "?????", "" };
dateTimeFormat.AMDesignator = "?.?";
dateTimeFormat.PMDesignator = "?.?";
dateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
dateTimeFormat.LongDatePattern = "yyyy/MMMM/dd";
dateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday;
if (readOnly)
{
typeof(DateTimeFormatInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetValue(dateTimeFormat, true);
}
}
}
}
Diptimaya PatraPosted Feb 21, 2010, 11:13 PM