如何在 ThisAddIn 类之外访问 VSTO Outlook 加载项中的应用程序属性?
Posted
技术标签:
【中文标题】如何在 ThisAddIn 类之外访问 VSTO Outlook 加载项中的应用程序属性?【英文标题】:How to access Application property in VSTO Outlook add-in outside of ThisAddIn class? 【发布时间】:2011-01-11 15:50:03 【问题描述】:使用新 Outlook VSTO C# 项目创建的这个AddIn 类有一个Application
属性,您可以使用它来访问 Outlook 文件夹和项目。问题是当您在 ThisAddIn 类中时可以轻松使用它,但从项目中的其他类无法轻松访问它。这是因为它是一个实例属性。
我想找到访问此属性在我的其他类中提供的相同功能的最佳方法,因此我提出了两种可能的解决方案,但我不知道其中哪一个(如果有的话)是好的。
假设我想获取默认收件箱文件夹。在 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);
是否有人对哪种方法更好有任何建议,如果您对此问题有不同的解决方案,我也会很感激。
【问题讨论】:
【参考方案1】:由于您可以拥有 ThisAddIn 的单个实例,因此您可以拥有一个静态变量来访问外部的应用程序表单...仅供参考,当您添加 Outlook-AddIn VSTO 项目时,ThisAddIn 的实例将作为静态类中的静态成员提供 全局变量
【讨论】:
我是否需要使用Globals
调用它。如果我添加一个静态属性,我可以使用ThisAddIn.MyStaticPropertyName
调用方法。
显然我可以跳过定义静态属性,因为我可以使用Globals.ThisAddIn.Application
。感谢您的帮助。
这是否也适用于 Excel 插件?【参考方案2】:
将静态变量放在 ThisAddIn 中以便从代码周围进行引用实际上是一种不好的做法。
根据这个答案https://***.com/a/46493968/2068626,Outlook Application 对象是一个单例,所以最好自己做第二个建议
var app = new Outlook.Application();
由于这是 Outlook VSTO 加载项,因此启动 Outlook 的风险零,因为它根据定义将运行。如果您在另一个 Office 应用程序中使用此方法,则只有在 Outlook 当前未运行时才会启动 Outlook。
为了完整起见,所有其他共享模型都应使用依赖注入的形式,这样您的代码中就没有强耦合。
使用这两种方法,您还可以更轻松(可能)将代码和其他类重构到单独的库中,以便在您的 VSTO 项目甚至 Nuget 包中更轻松地重用。
【讨论】:
以上是关于如何在 ThisAddIn 类之外访问 VSTO Outlook 加载项中的应用程序属性?的主要内容,如果未能解决你的问题,请参考以下文章
VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制C#版