public class Config
{
private static object lockFlag = new object();
private static Config instance;
[XmlIgnore]
public static Config Instance
{
get
{
lock(lockFlag)
{
if(instance == null)
{
try
{
//Пытаемся загрузить файл с диска и десериализовать его
using(FileStream fs =
new FileStream(LocalUser.GetDatabasePath()
+ "\\config.xml",FileMode.Open))
{
System.Xml.Serialization.XmlSerializer xs =
new System.Xml.Serialization.XmlSerializer(typeof(Config));
instance = (Config)xs.Deserialize(fs);
}
}
catch(Exception e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
}
}
}
return instance;
}
}
}
C# & Managed C++
Код:
Очень нужно переписать его под MC++, но методом тыка не хочется.... т.к. C# я не понимаю
Помогите пожалуйста. Заранее благодарен...
Класс из статьи на rsdn.ru
пробовал спросить на их форуме - ответа хрен дождёшься!
Цитата:
Originally posted by mail0
Есть класс реализованный на C#:
Очень нужно переписать его под MC++, но методом тыка не хочется.... т.к. C# я не понимаю
Помогите пожалуйста. Заранее благодарен...
Класс из статьи на rsdn.ru
пробовал спросить на их форуме - ответа хрен дождёшься!
Есть класс реализованный на C#:
Код:
public class Config
{
private static object lockFlag = new object();
private static Config instance;
[XmlIgnore]
public static Config Instance
{
get
{
lock(lockFlag)
{
if(instance == null)
{
try
{
//Пытаемся загрузить файл с диска и десериализовать его
using(FileStream fs =
new FileStream(LocalUser.GetDatabasePath()
+ "\\config.xml",FileMode.Open))
{
System.Xml.Serialization.XmlSerializer xs =
new System.Xml.Serialization.XmlSerializer(typeof(Config));
instance = (Config)xs.Deserialize(fs);
}
}
catch(Exception e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
}
}
}
return instance;
}
}
}
{
private static object lockFlag = new object();
private static Config instance;
[XmlIgnore]
public static Config Instance
{
get
{
lock(lockFlag)
{
if(instance == null)
{
try
{
//Пытаемся загрузить файл с диска и десериализовать его
using(FileStream fs =
new FileStream(LocalUser.GetDatabasePath()
+ "\\config.xml",FileMode.Open))
{
System.Xml.Serialization.XmlSerializer xs =
new System.Xml.Serialization.XmlSerializer(typeof(Config));
instance = (Config)xs.Deserialize(fs);
}
}
catch(Exception e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
}
}
}
return instance;
}
}
}
Очень нужно переписать его под MC++, но методом тыка не хочется.... т.к. C# я не понимаю
Помогите пожалуйста. Заранее благодарен...
Класс из статьи на rsdn.ru
пробовал спросить на их форуме - ответа хрен дождёшься!
Елки... когда то я на Java писал... вот были времена... а собственно че тут непонятного ? есть один вариант : объявляешь класс CConfig : CObject и реализуешь в нем метод Serialize... хотя если честно о C# и о managed C+ прочитал не больше 2 предложений...
Ну и еще конечно, если есть тьребование шоб оно в XML файл серилизило, те придется библотеку для работы на C++ с XML поискать... точно помню шо была .....
Код:
using namespace System;
using namespace System::Xml::Serialization;
using namespace System::IO;
using namespace System::Threading;
public __gc class Config
{
private:
static Config* instance;
String* someData;
static Object* lockFlag;
public:
static Config()
{
lockFlag = new Object();
}
__property String* get_SomeData()
{
return someData;
}
__property void set_SomeData( String* value )
{
someData = value;
}
[XmlIgnore]
__property static Config* get_Instance()
{
// monitor - это дотнетовская критическая секция, обход lock(lockFlag)
Monitor::Enter(lockFlag);
if(instance == NULL)
{
// вот здесь как поступать с using(FileStream fs = ... ) честно говоря не знаю.
// просто закрываем файл после работы
try
{
//Пытаемся загрузить файл с диска и десериализовать его
FileStream* fs = new FileStream("C:\\config.xml",FileMode::Open);
XmlSerializer* xs = new XmlSerializer(__typeof(Config));
try
{
instance = static_cast<Config*>(xs->Deserialize(fs));
}
__finally
{
fs->Close();
}
}
catch(Exception* e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
}
__finally
{
Monitor::Exit(lockFlag);
}
}
return instance;
}
void Save()
{
try
{
Monitor::Enter(lockFlag);
FileStream* fs = new FileStream("C:\\config.xml",FileMode::OpenOrCreate);
fs->SetLength(0);
XmlSerializer* xs = new XmlSerializer(__typeof(Config));
xs->Serialize( fs, this );
fs->Close();
}
__finally
{
Monitor::Exit(lockFlag);
}
}
};
using namespace System::Xml::Serialization;
using namespace System::IO;
using namespace System::Threading;
public __gc class Config
{
private:
static Config* instance;
String* someData;
static Object* lockFlag;
public:
static Config()
{
lockFlag = new Object();
}
__property String* get_SomeData()
{
return someData;
}
__property void set_SomeData( String* value )
{
someData = value;
}
[XmlIgnore]
__property static Config* get_Instance()
{
// monitor - это дотнетовская критическая секция, обход lock(lockFlag)
Monitor::Enter(lockFlag);
if(instance == NULL)
{
// вот здесь как поступать с using(FileStream fs = ... ) честно говоря не знаю.
// просто закрываем файл после работы
try
{
//Пытаемся загрузить файл с диска и десериализовать его
FileStream* fs = new FileStream("C:\\config.xml",FileMode::Open);
XmlSerializer* xs = new XmlSerializer(__typeof(Config));
try
{
instance = static_cast<Config*>(xs->Deserialize(fs));
}
__finally
{
fs->Close();
}
}
catch(Exception* e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
}
__finally
{
Monitor::Exit(lockFlag);
}
}
return instance;
}
void Save()
{
try
{
Monitor::Enter(lockFlag);
FileStream* fs = new FileStream("C:\\config.xml",FileMode::OpenOrCreate);
fs->SetLength(0);
XmlSerializer* xs = new XmlSerializer(__typeof(Config));
xs->Serialize( fs, this );
fs->Close();
}
__finally
{
Monitor::Exit(lockFlag);
}
}
};
тест делаем так
Код:
String* str = Config::Instance->SomeData;
Config::Instance->SomeData = "hshshs";
Config::Instance->Save();
Config::Instance->SomeData = "hshshs";
Config::Instance->Save();
а вообще советую почитать немного о C# - синтаксис осваивается за неделю, а потом продолжить этим: http://rsdn.ru/article/dotnet/mcpp.xml
все очень просто
Цитата:
Originally posted by PitxBull
Ну и еще конечно, если есть тьребование шоб оно в XML файл серилизило, те придется библотеку для работы на C++ с XML поискать... точно помню шо была .....
Ну и еще конечно, если есть тьребование шоб оно в XML файл серилизило, те придется библотеку для работы на C++ с XML поискать... точно помню шо была .....
там все замечательно делается средствами дотнетовского xml сериализатора. а если уж пользуем managed extensions - в .net framework есть свой xml парсер
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?
Цитата:
Originally posted by mail0
Спасибо большое. То что надо ;)
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?
Спасибо большое. То что надо ;)
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?
не знаю. с 2005 еще не работал
гы дык... всегда думал что managed C++ это обычный С++ который компилируется(почему то) в Common Language Runtime... а у в нем оказывается даже MFC нету... ))) шо за жизнь теперь без MFC будет... гмс... как говорил один программер : C++ быстрее чем Java )) ... теперь можно сказать : C++ быстрее чем managed C++ )))
Цитата:
Originally posted by mail0
Спасибо большое. То что надо ;)
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?
Спасибо большое. То что надо ;)
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?
Эквивалент __typeof - typeid. Юзается по-другому, так что см. VS2005 Documentation
Код:
public ref class Config
{
private:
static Config^ instance;
static Object^ lockFlag;
String^ someData;
public:
static Config()
{
lockFlag = gcnew Object();
}
property String^ SomeData
{
String^ get()
{
return someData;
}
void set( String^ value )
{
someData = value;
}
}
[XmlIgnore]
property static Config^ Instance
{
Config^ get()
{
// monitor - это дотнетовская критическая секция, обход lock(lockFlag)
Monitor::Enter(lockFlag);
if(!instance)
{
// вот здесь как поступать с using(FileStream fs = ... ) честно говоря не знаю.
// просто закрываем файл после работы
try
{
//Пытаемся загрузить файл с диска и десериализовать его
FileStream^ fs = gcnew FileStream("config.xml",FileMode::Open);
array<String^>^args = Environment::GetCommandLineArgs();
XmlSerializer^ xs = gcnew XmlSerializer(Config::typeid);
try
{
instance = static_cast<Config^>(xs->Deserialize(fs));
}
__finally
{
fs->Close();
}
}
catch(...)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = gcnew Config();
}
__finally
{
Monitor::Exit(lockFlag);
}
}
return instance;
}
}
void Save()
{
try
{
Monitor::Enter(lockFlag);
FileStream^ fs = gcnew FileStream("config.xml",FileMode::Create);
fs->SetLength(0);
XmlSerializer^ xs = gcnew XmlSerializer(Config::typeid);
xs->Serialize(fs, this );
fs->Close();
}
catch (Exception^ e)
{
Console::WriteLine(e->ToString());
}
__finally
{
Monitor::Exit(lockFlag);
}
}
};
{
private:
static Config^ instance;
static Object^ lockFlag;
String^ someData;
public:
static Config()
{
lockFlag = gcnew Object();
}
property String^ SomeData
{
String^ get()
{
return someData;
}
void set( String^ value )
{
someData = value;
}
}
[XmlIgnore]
property static Config^ Instance
{
Config^ get()
{
// monitor - это дотнетовская критическая секция, обход lock(lockFlag)
Monitor::Enter(lockFlag);
if(!instance)
{
// вот здесь как поступать с using(FileStream fs = ... ) честно говоря не знаю.
// просто закрываем файл после работы
try
{
//Пытаемся загрузить файл с диска и десериализовать его
FileStream^ fs = gcnew FileStream("config.xml",FileMode::Open);
array<String^>^args = Environment::GetCommandLineArgs();
XmlSerializer^ xs = gcnew XmlSerializer(Config::typeid);
try
{
instance = static_cast<Config^>(xs->Deserialize(fs));
}
__finally
{
fs->Close();
}
}
catch(...)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = gcnew Config();
}
__finally
{
Monitor::Exit(lockFlag);
}
}
return instance;
}
}
void Save()
{
try
{
Monitor::Enter(lockFlag);
FileStream^ fs = gcnew FileStream("config.xml",FileMode::Create);
fs->SetLength(0);
XmlSerializer^ xs = gcnew XmlSerializer(Config::typeid);
xs->Serialize(fs, this );
fs->Close();
}
catch (Exception^ e)
{
Console::WriteLine(e->ToString());
}
__finally
{
Monitor::Exit(lockFlag);
}
}
};