Изменение значения String в C # WinApp навсегда? - PullRequest
1 голос
/ 21 января 2011

Предположим, в моем WinApp есть строковое поле, как показано ниже:

публичная строка UsingTheApplicationFrom = "Пока нет";

Теперь я хочу навсегда изменить значение поля при первом запуске моего приложения. например: UsingTheApplicationFrom = "‎Friday, ‎January ‎21, ‎2011";

Возможно ли это в C # WinApp?
Не могли бы вы направить меня?

Редактировать:
Я не хочу использовать базу данных, файл, реестр или что-то еще.

Ответы [ 6 ]

3 голосов
/ 21 января 2011

Я предполагаю, но под «всегда» я думаю, что он означает «навсегда». Вы можете легко создать ключ в App.config вашего приложения и заполнить его при первом запуске.

<add key="UsingTheApplicationForm" value="Not Yet"/>

При первом запуске обновите его до -

            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            config.AppSettings.Settings["UsingTheApplicationForm"].Value = DateTime.Now.ToShortDateString();
            // Save the configuration file.
            config.Save(ConfigurationSaveMode.Modified);
            // Force a reload of a changed section.
            ConfigurationManager.RefreshSection("appSettings");

При втором запуске проверить, равно ли значение ключа «Пока нет». Если это не так, это означает, что это не первый запуск.

2 голосов
/ 21 января 2011

Вы ищете «тип защиты для моего приложения, в котором только первая система (которая запускает приложение в первый раз) могла использовать мое приложение». Я думаю, вы имеете в виду, что каждая копия программного обеспечения, которое вы продаете, может быть установлена ​​только на одном компьютере одновременно.

Вам нужно решить две проблемы:

  • Как сгенерировать уникальный идентификатор для компьютера
  • Как сохранить значение идентификатора

У вас есть несколько вариантов использования уникального идентификатора, ни один из которых не является хорошим. Будьте готовы к запросам поддержки от клиентов, когда они меняют компьютерное оборудование, когда их компьютер ломается, или когда они хотят перенести программное обеспечение с одного компьютера на другой. Приличный метод вычисления уникального идентификатора - эта статья ( зеркальная ссылка , поскольку статья проекта кода недоступна).

Я бы порекомендовал просто сохранить этот идентификатор в виде строки в файле app.config (используя Properties.Settings, начните с эту ссылку для получения дополнительной информации). Он будет виден в виде обычного текста, но как нелицензированный пользователь узнает, какое значение следует изменить для своего компьютера, когда оно выглядит как "4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9"? Если это не соответствует, направьте их на ваш сайт / телефон для поддержки.

У вас все еще есть проблема с выбором, когда устанавливать это значение - я бы посоветовал установить его как часть установщика, а не сохранять его при первом запуске программы, так как тогда у вас все еще есть проблема, чтобы определить, когда Программа запускается в первый раз. Для установки может потребоваться некоторый регистрационный код и метод связи с центральным сервером лицензирования. (Да, это действительно сложно. Как вы думаете, насколько решительно люди могут взломать ваше лицензирование?)

1 голос
/ 21 января 2011

В вашем program.cs или главной точке входа для программы объявляется общедоступная статическая дата-время.

при первом запуске программы вы можете установить дату и получить к ней доступ в будущем.

public static Datetime m_StartDate = DateTime.now;

public static void Main(args)
{
m_StartDate = DateTime.Now;
}

затем в других формах (если вы добавили код в Program.cs)

txtStartTime.Text = Program.m_StartDate.toString();
1 голос
/ 21 января 2011

Нет способа сделать это только с помощью строкового объекта, но вы можете создать простой объект, который это делает:

public class ApplicationInfo
{
    private ApplicationStartTime()
    {
        this.StartTime = new DateTime().Now;
    }

    public DateTime StartTime
    {
        get; private set;
    }

    public Create()
    {
        return new ApplicationStartTime();
    }
}

Я не скомпилировал это, поэтому может быть незначительныйсинтаксическая ошибка или два.Вы бы назвали это так:

var applicationInfo = ApplicationInfo.Create();

Debug.WriteLine(applicationInfo.StartTime.ToString());
1 голос
/ 21 января 2011
1 голос
/ 21 января 2011

Я думаю, что вы, возможно, захотите использовать DateTime, и в частности, DateTime.Now - как и в случае комментариев к вопросу, однако, я не совсем уверен.

Итак, что-то вроде:

UsingTheApplicationForm = String.Format("{0:dddd, MMMM d, yyyy}", DateTime.Now); 

Часть «всегда» очень сбивает с толку, я просто куплю свой перевод, где always = each startup.

Я бы также предположил, что, учитывая имя свойства / переменной UsingTheApplicationForm, это значение является ориентировочным, а не описательным; по этой причине, может ли просто использование DateTime.Now без какого-либо форматирования или даже просто логическое значение (зависит от того, что соответствует вашей ситуации), отвечающее требованиям?

Edit:

Информацию об использовании этого или любого другого метода, а также сохранение этих данных для следующего запуска см. В следующем вопросе и ответах ...

Редактирование app.config во время выполнения с использованием того же приложения

...