代码之家  ›  专栏  ›  技术社区  ›  RaYell

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

  •  17
  • RaYell  · 技术社区  · 16 年前

    Application 属性,您可以使用该属性访问Outlook文件夹和项目。问题是,当您在ThisAddIn类中时,可以很容易地使用它,但无法从项目中的其他类轻松访问它。这是因为它是一个实例属性。

    假设我想要获得默认的收件箱文件夹。在这个Addin类中,我会简单地执行以下操作:

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

    那么,在这门课之外,如何做同样的事情呢?

    首先,我可以将静态属性添加到 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.创建新的应用程序对象

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

    有没有人对哪种方法更好有什么建议,如果你对这个问题有不同的解决方案,我也会告诉你。

    1 回复  |  直到 16 年前
        1
  •  18
  •   Deepak N    16 年前

    因为您可以有一个ThisAddIn的实例,所以您可以有一个静态变量来访问外部的应用程序表单。。。仅供参考将Outlook加载项添加到项目时,此加载项的实例将作为静态类中的静态成员可用 全球的

        2
  •  0
  •   Peter    6 年前

    实际上,在ThisAddIn中放置静态变量以从代码周围引用是一种不好的做法。

    https://stackoverflow.com/a/46493968/2068626 ,Outlook应用程序对象是一个单例对象,因此最好执行您自己的第二个建议

    var app = new Outlook.Application();
    

    由于这是一个Outlook VSTO加载项,因此 启动Outlook的风险,因为根据定义它将运行。如果从另一个Office应用程序中使用此方法,则会启动Outlook 只有 Outlook当前未运行。

    为了完整性起见,所有其他共享模型都应该使用依赖注入的形式,这样代码中就没有强耦合。

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

    推荐文章