如何从其他类访问此插件中的VB.net计时器

如何从其他类访问此插件中的VB.net计时器,vb.net,vsto,Vb.net,Vsto,我已在Office插件(在VB.net中开发)中设置了计时器,可以使用以下代码将其设置为正常运行: Public Class ThisAddIn Friend WithEvents Timer1 As System.Timers.Timer Private Sub ThisAddIn_Startup() Handles Me.Startup Me.Timer1 = New System.Timers.Timer() Me.Timer1.Interval = 500

我已在Office插件(在VB.net中开发)中设置了计时器,可以使用以下代码将其设置为正常运行:

Public Class ThisAddIn

 Friend WithEvents Timer1 As System.Timers.Timer

 Private Sub ThisAddIn_Startup() Handles Me.Startup

    Me.Timer1 = New System.Timers.Timer()
    Me.Timer1.Interval = 500
    Me.Timer1.Enabled = True

 End Sub

 Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed

    Me.Timer1.Enabled = False
    MsgBox("Code Ran!")

 End Sub
Public Class ServerRibbon

 Public myCaller As ThisAddIn

 private sub respondToClick()

    Dim blah As System.Timers.Timer
    blah = myCaller.Timer1
    blah.Enabled = True

 end sub
当用户更改加载项功能区中的设置时,我想调用此计时器,但我似乎无法访问该事件。如果我使用代码:

Public Class ThisAddIn

 Friend WithEvents Timer1 As System.Timers.Timer

 Private Sub ThisAddIn_Startup() Handles Me.Startup

    Me.Timer1 = New System.Timers.Timer()
    Me.Timer1.Interval = 500
    Me.Timer1.Enabled = True

 End Sub

 Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed

    Me.Timer1.Enabled = False
    MsgBox("Code Ran!")

 End Sub
Public Class ServerRibbon

 Public myCaller As ThisAddIn

 private sub respondToClick()

    Dim blah As System.Timers.Timer
    blah = myCaller.Timer1
    blah.Enabled = True

 end sub
我得到一个错误“对象引用未设置为对象的实例”。有人能解释一下我如何设置计时器吗


提前感谢,

您的代码无法工作,因为
myCaller
未设置为您的
ThisAddIn
的特定实例(理论上,可能有许多
ThisAddIn
实例在内存中浮动)

但是,由于您正在开发office加载项,因此实际上只有一个ThisAddIn实例。访问计时器的一个简单解决方法是将Timer1设置为共享变量:

Friend Shared WithEvents Timer1 As System.Timers.Timer
这将允许您以
ThisAddIn.Timer1
的身份访问计时器

(请注意,一般来说,可公开访问的共享字段(也称为全局变量)是一个坏主意。但是,在您的情况下,它可能只是允许您执行所需操作的最简单解决方案。)

PS:您可能想了解类和类实例之间的区别


编辑:由于计时器附带了一个事件处理程序,因此

(a) 还需要共享事件处理程序(
Private shared Sub Timer1\u expressed…
),这有一个缺点,即事件处理程序无法再访问此插件的实例变量,或者

(b) 通过单独的属性访问
ThisAddIn
的实例,而不是共享字段:

Public Class ThisAddIn

    Friend WithEvents Timer1 As System.Timers.Timer

    Private Shared _instance As ThisAddIn
    Public ReadOnly Shared Property Instance() As ThisAddIn
        Get
            Return _instance
        End Get
    End Property

    Private Sub ThisAddIn_Startup() Handles Me.Startup
        _instance = Me

        Me.Timer1 = New System.Timers.Timer()
        Me.Timer1.Interval = 500
        Me.Timer1.Enabled = True
     End Sub

...

Public Class ServerRibbon
    Private Sub respondToClick()
        ThisAddIn.Instance.Timer1.Enabled = True
    End Sub
End Class

您可以使计时器本身共享,但更优雅的方法是将启动计时器的函数/子函数设置为公共函数,并将其称为

如果这对其他任何人都有用,您还可以通过
Globals访问实例化的ThisAddIn对象。ThisAddIn

所以

在项目的其他地方:

Public Class MyClass

    Private Sub DoSomething()
        Dim myint= Globals.ThisAddIn.N
    End Sub
End Class

谢谢你的回答-只有一个问题;现在我有了public sub,但当我尝试调用它时,startTimer()不起作用,因为它没有在这个模块中定义。myCaller.startTimer()给出了一个错误,即对象引用未设置为对象的实例…您好,谢谢您的建议。现在唯一的问题是,当我尝试访问计时器时,我收到一条新的错误消息“shared WithEvents变量的事件不能由非共享方法处理”。知道如何解决它吗?@user867358:添加“共享”方法定义的关键字:
Private Shared Sub Timer1\u appeased…
Hi Heinzi-如果不使用实例位,它可以工作!me需要替换为ThisAddIn,但它无法识别实例方式。。。