2

假设我的 WinApp 中有一个字符串字段,如下所示:

公共字符串 UsingTheApplicationFrom = "还没有";

现在,我想在我的应用程序第一次运行时永远更改该字段的值。例如:UsingTheApplicationFrom = "‎Friday, ‎January ‎21, ‎2011";

在 C# WinApp 中可能吗?
你能指导我吗?

编辑:
我不想使用数据库或文件或注册表或其他东西。

4

6 回答 6

3

我在猜测,但“总是”我认为他的意思是“永远”。您可以轻松地在应用程序的 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");

在第二次运行时检查键值是否等于“Not Yet”。如果不是,则意味着这不是第一次运行。

于 2011-01-21T14:50:36.063 回答
3

您正在寻找“我的应用程序的一种安全类型,只有第一个系统(第一次运行该应用程序)才能使用我的应用程序”。我认为您的意思是您销售的每个软件副本一次只能安装在一台计算机上。

你有两个问题需要解决:

  • 如何为计算机生成唯一标识符
  • 如何存储标识符值

您有几个选项可用于唯一标识符,但都不是很好。当客户更改计算机硬件、计算机损坏或要将软件从一台计算机移动到另一台计算机时,请为客户的支持请求做好准备。本文是计算唯一标识符的一种看起来不错的方法(镜像链接,因为代码项目文章不可用)。

我建议仅将此标识符作为字符串存储在 app.config 文件中(使用Properties.Settings,从此链接开始以获取更多信息)。它将以纯文本形式显示,但是当它看起来像“4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9”时,未经许可的用户如何知道为他们的机器将其更改为什么值?如果不匹配,请直接到您的网站/电话寻求支持。

您仍然有决定何时设置此值的问题 - 我建议将其设置为安装程序的一部分,而不是在程序第一次运行时保存它,因为那时您仍然无法确定程序何时运行首轮。安装程序可能需要某种注册码和与中央许可服务器通信的方法。(是的,这确实变得复杂了——你认为人们可能会如何确定破解你的许可?)

于 2011-01-21T15:20:29.167 回答
2

我想也许你想使用DateTime,特别是DateTime.Now- 就像对问题的评论一样,我不太确定。

所以,像:

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

不过,“总是”部分非常令人困惑,我只想购买我自己的翻译,其中always = each startup.

我还推测,鉴于 的属性/变量名称UsingTheApplicationForm,该值是指示性字段,而不是描述性字段;出于这个原因,可能只使用DateTime.Now没有任何格式,甚至只是一个布尔值(取决于你的情况)是否符合要求?

编辑:

有关使用此方法或任何其他方法以及为下次运行保留此数据的信息,请参阅以下问题和答案...

使用同一个 App 在执行时编辑 app.config

于 2011-01-21T14:37:05.223 回答
1

我喜欢这种方式: http: //windowsclient.net/blogs/suryahg/archive/2008/08/11/persist-winforms-application-settings.aspx

于 2011-01-21T14:37:55.423 回答
1

仅使用字符串对象就无法做到这一点,但是您可以创建一个简单的对象来执行此操作:

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());
于 2011-01-21T14:39:41.883 回答
1

在您的 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();
于 2011-01-21T14:40:36.757 回答