在VSTO插件中存储一些数据的最佳方法是什么?

时间:2016-11-25 11:24:14

标签: c# outlook vsto outlook-addin

我开发了一个Outlook加载项,必须是On或Off。

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

ThisAddIn.cs

public static bool isAddInOn = false;

RibbonButton.cs

    private void btnRibbon_Click(object sender, RibbonControlEventArgs e)
    {
        if (ThisAddIn.isAddInOn )
        {

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

        }
        else
        {

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


        }
    }

它正在发挥作用。但是当我关闭outlook并再次打开它时,静态变量再次重置。这意味着当我默认打开outlook时,我的加载项处于禁用状态。

我只想在某个地方存储该值。所以我可以在Outlook重新开启时查看该值。

情境:

1)开放前景

2)点击徽标(带状)

启用加载项

3)现在关闭前景

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

所以我怎么能实现这个目标呢?

4 个答案:

答案 0 :(得分:4)

您可以使用多种技术来实现此结果。确保您的设置必须在加载项启动期间序列化为某些存储/反序列化。

可能的解决方案之一可能是使用注册表(在这种情况下可能是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();
        }
    }

应在加载项初始化期间使用此类存储/检索的变量来设置属性。所以修改可能看起来像:

<强> ThisAddin.cs

public static bool isAddInOn = ReadFromRegistry("MySetting1", "0") == "1";

<强> RibbonButton.cs

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");
}

其他选项可以序列化为文件 - 某些类具有序列化的设置,即隔离存储,数据库(本地或中央)等。

答案 1 :(得分:2)

多年来,我已经使用了几种方法来存储用户的配置数据。

  • Properties.Settings.Default.Properties,因此写入应用程序项目属性。多年来,对于数百名用户来说,它都是可靠的,从未有过任何问题。

  • 本地配置文件(以文本形式),因此使用后备写入用户的已知区域。在稳定的环境中,可以为用户选择家乡区域,并读取/写入本地配置文件,这也使它可以在需要中断和需要手动更改时进行支持。作为备用,可以写到本地temp文件夹。

  • 注册表是我在这种情况下没有使用的选项,但它可能是一个不错的选择。

性能可能是一个关键问题,因为它会影响用户界面。另一个问题是开发人员的易用性。对于这两者,我的选择都是在应用程序的属性中进行设置,在该属性中,读取和写入非常简单并且可以在代码中进行处理,而且速度可能非常快。

Properties.Settings.Default.PropertyName = propertValue;

阅读

var propertValue = Properties.Settings.Default.PropertyName;

答案 2 :(得分:0)

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

您可以在OutlookSpy中看到隐藏的项目 - 点击IMAPIFolder按钮,转到“关联的内容”标签。

以编程方式,可以使用Outlook对象模型中的MAPIFolder.GetStorage访问此类项目。

答案 3 :(得分:0)

2018更新的答案

现在推荐的方法是在项目属性中使用已经配置的设置文件。这些文件是在创建项目时自动生成的:

enter image description here

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

enter image description here

您可以在任何地方以编程方式访问Properties.Settings.Default.Properties中的设置值。

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

同步

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

加载网页设置

“加载Web设置”显示一个“登录”对话框,通过该对话框,您可以加载经过身份验证的用户或匿名用户的设置。仅当在“服务”页面上启用了客户端应用程序服务并指定了Web设置服务位置时,此按钮才启用。

查看代码

对于C#项目,使用“查看代码”按钮可以查看Settings.cs file中的代码。该文件定义Settings类,使您可以处理Settings对象上的特定事件。在Visual Basic以外的其他语言中,必须持久调用此包装器类的Save方法,以保留用户设置。通常,您可以在主表单的Closing事件处理程序中执行此操作。以下是对Save方法的调用示例: C#

Properties.Settings.Default.Save();

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

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

访问修饰符

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

对于Visual C#项目,访问修饰符可以是Internal或Public。

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

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

有关设置帮助程序类的更多信息,请参阅管理应用程序设置。

设置网格

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

名称

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

类型

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

范围

选择“应用程序”或“用户”。

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

用户范围的设置(例如系统字体)旨在用于用户首选项。用户可以在运行时更改它们。

与应用程序设置关联的数据或值。例如,如果设置为字体,则其值可以为Verdana, 9.75pt, style=Bold

Documentation link

Reading settings

Writing settings