如何访问ThisAddIn类之外的VSTO Outlook加载项中的应用程序属性?

时间:2010-02-01 09:53:38

标签: c# .net vsto outlook-addin

使用新的Outlook VSTO C#项目创建的ThisAddIn类具有Application属性,您可以使用该属性访问Outlook文件夹和项目。问题是当你在ThisAddIn类中时可以轻松使用它,但是从项目中的其他类中无法轻松访问它。这是因为它是一个实例属性。

我想找到访问此属性在其他类中提供的相同功能的最佳方式,因此我提出了两种可能的解决方案,但我不知道它们中的哪一种(如果有的话)是好的。< / p>

让我们假设我想要获取默认的收件箱文件夹。在ThisAddIn类里面我会做这样的事情:

this.Application.Session.GetDefaultFolder(Outlook.olFolderInbox);

现在如何在这堂课外做同样的事情?

1。静态属性

首先,我可以向ThisAddIn类添加一个静态属性,并将其设置为我想在其他类中公开的值。

public partial class ThisAddIn
{
    public Outlook.Application OutlookApp;

    void ThisAddIn_Startup(object sender, EventArgs e)
    {
        // init static variable value here
        OutlookApp = this.Application

        // initialize the rest of addin here
    }

    void InternalStartup()
    {
        this.Startup += this.ThisAddIn_Startup;
    }
}

这种方式在我的任何其他课程中都可以这样做:

ThisAddIn.OutlookApp.Session.GetDefaultFolder(Outlook.olFolderInbox);

2。创建新的应用程序对象

我可以做的第二件事是在我使用它之前在我的其他类中初始化Application对象。但我不确定创建该类型的新对象是否不会创建Outlook的新实例。

class MyOtherClass
{
    public void MyMethod()
    {
        var app = new Outlook.Application();
        var folder = app.Session.GetDefaultFolder(Outlook.olFolderInbox);
    }
}

有没有人有任何建议哪种方法更好,如果你对这个问题有不同的解决方案,我也应该这样做。

2 个答案:

答案 0 :(得分:17)

由于你可以拥有一个ThisAddIn实例,你可以拥有一个静态变量来访问外部的应用程序表单...当你添加Outlook-AddIn VSTO项目时,这个AddAdIn的实例将作为静态类中的静态成员提供全局

答案 1 :(得分:0)

实际上,将静态变量放在ThisAddIn中以便从代码中进行引用实际上是一种不好的做法。

根据此答案https://stackoverflow.com/a/46493968/2068626,Outlook Application对象是一个单例,因此最好自己做第二个建议

var app = new Outlook.Application();

由于这是Outlook VSTO加载项,因此启动Outlook的风险为,因为按定义它将运行。如果您在另一个Office应用程序中使用此方法,则仅在当前未运行Outlook的情况下才能启动Outlook。

出于完整性考虑,所有其他共享模型都应使用一种形式的Dependency Injection,以便在您的代码中没有强耦合。

使用这两种方法,也可以更容易(可能)将代码和其他类重构为一个单独的库,以便在VSTO项目甚至Nuget包中更轻松地重用。