Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ThisAddIn类之外访问VSTO Outlook加载项中的应用程序属性?_C#_.net_Vsto_Outlook Addin - Fatal编程技术网

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

C# 如何在ThisAddIn类之外访问VSTO Outlook加载项中的应用程序属性?,c#,.net,vsto,outlook-addin,C#,.net,Vsto,Outlook Addin,使用新Outlook VSTO C#项目创建的ThisAddIn类有一个应用程序属性,您可以使用该属性访问Outlook文件夹和项目。问题是,当您在ThisAddIn类中时,可以很容易地使用它,但无法从项目中的其他类轻松访问它。这是因为它是一个实例属性 我想找到访问该属性在我的其他类中提供的相同功能的最佳方法,因此我提出了两种可能的解决方案,但我不知道哪一种(如果有的话)是好的 假设我想要获得默认的收件箱文件夹。在这个Addin类中,我会简单地执行以下操作: this.Application.S

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

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

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

this.Application.Session.GetDefaultFolder(Outlook.olFolderInbox);
ThisAddIn.OutlookApp.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;
    }
}
这样,在我的任何其他课程中,我都可以做这样的事情:

this.Application.Session.GetDefaultFolder(Outlook.olFolderInbox);
ThisAddIn.OutlookApp.Session.GetDefaultFolder(Outlook.olFolderInbox);
2.创建新的应用程序对象 我可以做的第二件事是在使用另一个类之前初始化该类中的应用程序对象。但我不确定创建这种类型的新对象是否不会创建Outlook的新实例

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

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

因为你可以有这个插件的单个实例,你可以有一个静态变量来访问外部的申请表。。。仅供参考当您将Outlook加载项添加到VSTO项目时,ThisAddIn的实例将作为静态类Globals中的静态成员提供

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

根据这个答案,Outlook应用程序对象是一个单例对象,因此最好执行您自己的第二个建议

var-app=newoutlook.Application();
由于这是一个Outlook VSTO加载项,因此启动Outlook的风险为零,因为根据定义,它将运行。如果从另一个Office应用程序中使用此方法,则只有在Outlook当前未运行的情况下才能启动Outlook

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


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

是否需要使用
Globals
调用它。如果我添加一个静态属性,我可以使用
ThisAddIn.MyStaticPropertyName
调用方法。显然,我可以跳过定义静态属性,因为我可以使用
Globals.ThisAddIn.Application
。谢谢您的帮助。这是否也适用于Excel加载项?