C# 在VSTO加载项中存储某些数据的最佳方式是什么?

C# 在VSTO加载项中存储某些数据的最佳方式是什么?,c#,outlook,vsto,outlook-addin,C#,Outlook,Vsto,Outlook Addin,我开发了一个outlook插件,它必须打开或关闭 为此,我声明了一个静态变量,如下所示 ThisAddIn.cs public static bool isAddInOn = false; private void btnRibbon_Click(object sender, RibbonControlEventArgs e) { if (ThisAddIn.isAddInOn ) { ThisAddIn.isAddIn

我开发了一个outlook插件,它必须打开或关闭

为此,我声明了一个静态变量,如下所示

ThisAddIn.cs

public static bool isAddInOn = false;
    private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
    {
        if (ThisAddIn.isAddInOn )
        {

            ThisAddIn.isAddInOn = false; 
            btnRibbon.Label = "Disabled";

        }
        else
        {

            ThisAddIn.isAddInOn = true;
            btnRibbon.Label = "Enabled";


        }
    }
public static bool isAddInOn = ReadFromRegistry("MySetting1", "0") == "1";
private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
{
    if (ThisAddIn.isAddInOn )
    {

        ThisAddIn.isAddInOn = false; 
        btnRibbon.Label = "Disabled";

    }
    else
    {

        ThisAddIn.isAddInOn = true;
        btnRibbon.Label = "Enabled";


    }
    StoreInRegistry("MySetting1", ThisAddIn.isAddInOn ? "1" : "0");
}
RibbonButton.cs

public static bool isAddInOn = false;
    private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
    {
        if (ThisAddIn.isAddInOn )
        {

            ThisAddIn.isAddInOn = false; 
            btnRibbon.Label = "Disabled";

        }
        else
        {

            ThisAddIn.isAddInOn = true;
            btnRibbon.Label = "Enabled";


        }
    }
public static bool isAddInOn = ReadFromRegistry("MySetting1", "0") == "1";
private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
{
    if (ThisAddIn.isAddInOn )
    {

        ThisAddIn.isAddInOn = false; 
        btnRibbon.Label = "Disabled";

    }
    else
    {

        ThisAddIn.isAddInOn = true;
        btnRibbon.Label = "Enabled";


    }
    StoreInRegistry("MySetting1", ThisAddIn.isAddInOn ? "1" : "0");
}
它正在工作。但是当我关闭outlook并再次打开它时,静态变量会再次重置。这意味着在默认情况下打开outlook时,外接程序处于禁用状态

我只想把这个值存储在某个地方。这样我可以在outlook重新打开时检查该值

场景:

1) 开放式outlook

2) 通过单击外接程序的徽标(位于功能区中)启用外接程序

3) 现在关闭outlook

4) 当我再次打开outlook时,必须启用它


那么我如何才能做到这一点呢?

有几种方法可以用来实现这一结果。确实,在启动外接程序期间,必须将设置序列化到某些存储/反序列化

一个可能的解决方案是使用registry(在这种情况下可能是HKCU(当前用户,然后对使用外接程序的每个用户都是私有的),并且不需要特殊权限

用于存储变量:

    public void StoreInRegistry(string keyName, string value)
    {
        RegistryKey rootKey = Registry.CurrentUser;
        string registryPath = @"Software\YourCompanyName\YourAddInName";
        using (RegistryKey rk = rootKey.CreateSubKey(registryPath))
        {
            rk.SetValue(keyName, value, RegistryValueKind.String);
        }
    }
    public string ReadFromRegistry(string keyName, string defaultValue)
    {
        RegistryKey rootKey = Registry.CurrentUser;
        string registryPath = @"Software\YourCompanyName\YourAddInName";
        using (RegistryKey rk = rootKey.OpenSubKey(registryPath, false))
        {
            if (rk == null)
            {
                return defaultValue;
            }

            var res = rk.GetValue(keyName, defaultValue);
            if (res == null)
            {
                return defaultValue;
            }

            return res.ToString();
        }
    }
对于读取变量:

    public void StoreInRegistry(string keyName, string value)
    {
        RegistryKey rootKey = Registry.CurrentUser;
        string registryPath = @"Software\YourCompanyName\YourAddInName";
        using (RegistryKey rk = rootKey.CreateSubKey(registryPath))
        {
            rk.SetValue(keyName, value, RegistryValueKind.String);
        }
    }
    public string ReadFromRegistry(string keyName, string defaultValue)
    {
        RegistryKey rootKey = Registry.CurrentUser;
        string registryPath = @"Software\YourCompanyName\YourAddInName";
        using (RegistryKey rk = rootKey.OpenSubKey(registryPath, false))
        {
            if (rk == null)
            {
                return defaultValue;
            }

            var res = rk.GetValue(keyName, defaultValue);
            if (res == null)
            {
                return defaultValue;
            }

            return res.ToString();
        }
    }
在外接程序初始化期间,应使用此存储/检索的变量来设置属性。因此,修改可能如下所示:

ThisAddin.cs

public static bool isAddInOn = false;
    private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
    {
        if (ThisAddIn.isAddInOn )
        {

            ThisAddIn.isAddInOn = false; 
            btnRibbon.Label = "Disabled";

        }
        else
        {

            ThisAddIn.isAddInOn = true;
            btnRibbon.Label = "Enabled";


        }
    }
public static bool isAddInOn = ReadFromRegistry("MySetting1", "0") == "1";
private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
{
    if (ThisAddIn.isAddInOn )
    {

        ThisAddIn.isAddInOn = false; 
        btnRibbon.Label = "Disabled";

    }
    else
    {

        ThisAddIn.isAddInOn = true;
        btnRibbon.Label = "Enabled";


    }
    StoreInRegistry("MySetting1", ThisAddIn.isAddInOn ? "1" : "0");
}
RibbonButton.cs

public static bool isAddInOn = false;
    private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
    {
        if (ThisAddIn.isAddInOn )
        {

            ThisAddIn.isAddInOn = false; 
            btnRibbon.Label = "Disabled";

        }
        else
        {

            ThisAddIn.isAddInOn = true;
            btnRibbon.Label = "Enabled";


        }
    }
public static bool isAddInOn = ReadFromRegistry("MySetting1", "0") == "1";
private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
{
    if (ThisAddIn.isAddInOn )
    {

        ThisAddIn.isAddInOn = false; 
        btnRibbon.Label = "Disabled";

    }
    else
    {

        ThisAddIn.isAddInOn = true;
        btnRibbon.Label = "Enabled";


    }
    StoreInRegistry("MySetting1", ThisAddIn.isAddInOn ? "1" : "0");
}

其他选项可以序列化为文件-某些类的设置序列化为独立存储、数据库(本地或中央)等。

设置可以存储为隐藏的(关联的)文件夹中的项目,例如收件箱或日历文件夹。例如,Outlook将类别列表作为隐藏项存储在日历文件夹中。POP3邮件ID存储在收件箱中的隐藏项中。隐藏项的优点是具有漫游功能-Exchange邮箱用户可以从任何计算机查看数据

您可以在中看到隐藏的项目-单击IMAPIFolder按钮,转到“关联内容”选项卡

通过编程,可以在Outlook对象模型中使用访问这些项目。

2018更新答案
建议现在使用项目属性中已配置的设置文件。这些文件在创建项目时自动生成:

并在单击时打开以下窗口:

您可以通过编程方式将设置值访问到
Properties.settings.Default.Properties
任意位置

设置页面顶部的标题栏包含多个控件:

使同步 同步将应用程序在运行时或调试期间使用的用户范围设置还原为其在设计时定义的默认值。若要还原数据,请从磁盘而不是从项目数据中删除运行时生成的应用程序特定文件

加载Web设置 加载Web设置显示一个登录对话框,允许您加载已验证用户或匿名用户的设置。只有在“服务”页面上启用了客户端应用程序服务并指定了Web设置服务位置时,才启用此按钮

视图代码 对于C#项目,“查看代码”按钮使您能够查看Settings.cs文件中的代码。此文件定义了Settings类,该类使您能够处理设置对象上的特定事件。在Visual Basic以外的语言中,您必须按顺序显式调用此包装类的Save方法保存用户设置。通常在主窗体的
关闭
事件处理程序中执行此操作。下面是调用
保存
方法的示例: C#

对于Visual Basic项目,“查看代码”按钮使您能够查看Settings.vb文件中的代码。该文件定义了MySettings类,该类使您能够处理My.Settings对象上的特定事件。有关使用My.Settings对象访问应用程序设置的更多信息,请参阅访问应用程序设置

有关访问应用程序设置的详细信息,请参阅Windows窗体的应用程序设置

访问修饰符 访问修改器按钮指定Visual Studio在
Settings.Designer.cs
Settings.Designer.vb
中生成的Properties.Settings(在C#)或
My.Settings
(在Visual Basic中)助手类的访问级别

对于Visual C#项目,访问修饰符可以是内部的,也可以是公共的

对于Visual Basic项目,访问修饰符可以是Friend或Public

默认情况下,该设置在C#中为内部设置,在Visual Basic中为Friend。当Visual Studio以内部或Friend形式生成帮助程序类时,可执行(.exe)应用程序无法访问已添加到类库(.dll文件)中的资源和设置。如果必须共享类库中的资源和设置,请将访问修饰符设置为“公共”

有关设置帮助器类的详细信息,请参见管理应用程序设置

设置网格 设置网格用于配置应用程序设置。此网格包括以下列:

名称 在此字段中输入应用程序设置的名称

类型 使用下拉列表选择设置的类型。最常用的类型显示在下拉列表中,例如字符串,(连接字符串),和System.Drawing.Font。您可以通过选择列表末尾的“浏览”,然后从“选择类型”对话框中选择一种类型来选择另一种类型。选择类型后,它将添加到下拉列表中的“常用类型”(仅适用于当前解决方案)

范围 选择应用程序或用户

应用程序范围的设置(如连接字符串)与应用程序关联。用户无法在运行时更改应用程序范围的设置

使用者-