Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C# & Managed C++

1.9K
26 октября 2005 года
mail0
137 / / 09.05.2005
Есть класс реализованный на 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;
    }
  }
}


Очень нужно переписать его под MC++, но методом тыка не хочется.... т.к. C# я не понимаю
Помогите пожалуйста. Заранее благодарен...

Класс из статьи на rsdn.ru
пробовал спросить на их форуме - ответа хрен дождёшься!
351
27 октября 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by mail0
Есть класс реализованный на 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;
    }
  }
}


Очень нужно переписать его под MC++, но методом тыка не хочется.... т.к. C# я не понимаю
Помогите пожалуйста. Заранее благодарен...

Класс из статьи на rsdn.ru
пробовал спросить на их форуме - ответа хрен дождёшься!



Елки... когда то я на Java писал... вот были времена... а собственно че тут непонятного ? есть один вариант : объявляешь класс CConfig : CObject и реализуешь в нем метод Serialize... хотя если честно о C# и о managed C+ прочитал не больше 2 предложений...

351
27 октября 2005 года
PitxBull
633 / / 22.12.2004
Ну и еще конечно, если есть тьребование шоб оно в XML файл серилизило, те придется библотеку для работы на C++ с XML поискать... точно помню шо была .....
1.8K
28 октября 2005 года
Jeff
94 / / 22.04.2003
ну, если попробовать быстро сделать, то работает такой код:

Код:
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);
    }
  }
   
};


тест делаем так

 
Код:
String* str = Config::Instance->SomeData;
Config::Instance->SomeData = "hshshs";
Config::Instance->Save();


а вообще советую почитать немного о C# - синтаксис осваивается за неделю, а потом продолжить этим: http://rsdn.ru/article/dotnet/mcpp.xml

все очень просто
1.8K
28 октября 2005 года
Jeff
94 / / 22.04.2003
Цитата:
Originally posted by PitxBull
Ну и еще конечно, если есть тьребование шоб оно в XML файл серилизило, те придется библотеку для работы на C++ с XML поискать... точно помню шо была .....



там все замечательно делается средствами дотнетовского xml сериализатора. а если уж пользуем managed extensions - в .net framework есть свой xml парсер

1.9K
28 октября 2005 года
mail0
137 / / 09.05.2005
Спасибо большое. То что надо ;)
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?
1.8K
28 октября 2005 года
Jeff
94 / / 22.04.2003
Цитата:
Originally posted by mail0
Спасибо большое. То что надо ;)
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?



не знаю. с 2005 еще не работал

351
28 октября 2005 года
PitxBull
633 / / 22.12.2004
гы дык... всегда думал что managed C++ это обычный С++ который компилируется(почему то) в Common Language Runtime... а у в нем оказывается даже MFC нету... ))) шо за жизнь теперь без MFC будет... гмс... как говорил один программер : C++ быстрее чем Java )) ... теперь можно сказать : C++ быстрее чем managed C++ )))
14K
29 октября 2005 года
EvilGremlin
1 / / 29.10.2005
Цитата:
Originally posted by mail0
Спасибо большое. То что надо ;)
Но вот вопрос возник... я почти полностью перевёл предоставленный код под "новый стиль" (под расширения предоставляемые в VS2005), за исключением одной вещи...
Ругается на __typeof типа это надо применять в старом синтаксисе, так вот чем это заменить?


Эквивалент __typeof - typeid. Юзается по-другому, так что см. VS2005 Documentation

1.9K
29 октября 2005 года
mail0
137 / / 09.05.2005
В общем вот что у меня получилось...
Код:
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);
    }
}
};
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог