Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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
VB.NET Visual Studio Outlook 2013加载项项目-事件似乎未触发_Vb.net_Events_Outlook Addin - Fatal编程技术网

VB.NET Visual Studio Outlook 2013加载项项目-事件似乎未触发

VB.NET Visual Studio Outlook 2013加载项项目-事件似乎未触发,vb.net,events,outlook-addin,Vb.net,Events,Outlook Addin,感谢您抽出时间查看我的第一篇文章 我正在开发一个Outlook加载项(使用Visual Studio community 2013),使用户可以轻松地为我们的客户服务部门填充电子邮件模板。 该插件工作正常,但我需要添加一些功能,以便在电子邮件实际发送后将一些数据(跟踪KPI)记录到数据库中 经过一些研究,我为应用程序itemSend事件实现了一个类级事件处理程序 这在开发机器上非常有效,但是当我在客户机上发布并安装应用程序时,事件似乎没有触发,因为没有调用将数据记录到数据库的代码 由于无法使其工

感谢您抽出时间查看我的第一篇文章

我正在开发一个Outlook加载项(使用Visual Studio community 2013),使用户可以轻松地为我们的客户服务部门填充电子邮件模板。 该插件工作正常,但我需要添加一些功能,以便在电子邮件实际发送后将一些数据(跟踪KPI)记录到数据库中

经过一些研究,我为应用程序itemSend事件实现了一个类级事件处理程序

这在开发机器上非常有效,但是当我在客户机上发布并安装应用程序时,事件似乎没有触发,因为没有调用将数据记录到数据库的代码

由于无法使其工作,我尝试了一种变通方法,随后将其更改为使用已发送文件夹的.ItemAdd事件。(这里的代码是从Pranav借来的:)

这在开发机器上也可以很好地工作,但是,在客户端macine上安装加载项后,事件似乎无法触发

当我现在用两种不同的方法目睹同样的行为时,我觉得有一些明显的事情我没有做。我是遗漏了什么还是没有考虑到什么

代码示例如下所示:

Imports Microsoft.Office.Tools.Ribbon
Imports System.Runtime.InteropServices
Imports System.IO
Imports MySql.Data.MySqlClient
Imports System.Diagnostics

Public Class ThisAddIn
Public WithEvents oSentFolder As Outlook.Folder
Public WithEvents oSentItems As Outlook.Items

Private Sub ThisAddIn_Startup() Handles Me.Startup
    oSentFolder = Globals.ThisAddIn.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail)
    oSentItems = oSentFolder.Items
End Sub

Private Sub InsertSurveyTimestamp() Handles oSentItems.ItemAdd
    System.Windows.Forms.MessageBox.Show("oSentItems.ItemAdd Event")
End Sub
Private Sub Application_ItemSend(ByVal oItem As Object, ByRef Cancel As Boolean) Handles Application.ItemSend
    System.Windows.Forms.MessageBox.Show("Application.ItemSend Event")
    log.WriteToErrorLog("Application ItemSend Reached", "", "Event")
    If TypeOf oItem Is Outlook.MailItem Then Call SentMailTimestamp(oItem)
    System.Windows.Forms.MessageBox.Show("end of Itemsend Event")
End Sub

Private Sub SentMailTimestamp(oitem As Outlook.MailItem)
    log.WriteToErrorLog("SentMailTimestamp Sub Reached", "", "Subroutine Flag")
    Try
        'Dim oitem As Outlook.MailItem = oSentItems.Item(oSentItems.Count) 'for use with oSentItems.ItemAdd event
        'Check the CSOSurvey property exists to make sure its a CSO Survey email, exit if not a CSOSurvey Email
        Dim o = oitem.ItemProperties("CSOSurvey")
        If (o IsNot Nothing) AndAlso (o.Value IsNot Nothing) Then
            System.Diagnostics.Debug.WriteLine("CSOsurvey email: " & o.Value.ToString)
            log.WriteToErrorLog("Email was CSO Survey", "Value: " & o.Value.ToString, "Email Property")
        Else
            System.Diagnostics.Debug.WriteLine("CSOsurvey email: Null")
            log.WriteToErrorLog("Email was NOT CSO Survey", "", "Email Property")
            oitem = Nothing
            o = Nothing
            Exit Sub
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    'Save the timedatestamp of the email template being sent
    Using sqlCommand As New MySqlCommand
        Dim querystr As String = "INSERT INTO cs_survey_emaillog (SRID,exec,datetimestamp) values(@srid,@exec,@datetimestamp)"
        Dim mysqlconn As MySqlConnection
        Try
            mysqlconn = New MySqlConnection(GlobalVariables.connstr)
            mysqlConn.Open()
        Catch ex As MySqlException
            System.Windows.Forms.MessageBox.Show("Unable to write to Log. Please contact bst.uk@chep.com" & vbCrLf & ex.Message)
            log.WriteToErrorLog(ex.Message, ex.StackTrace, "MySQL Error")
            Exit Sub
        End Try
        If mysqlconn.State = Data.ConnectionState.Open Then
            Try
                With sqlCommand
                    .Connection = mysqlconn
                    .CommandText = querystr
                    .CommandType = Data.CommandType.Text
                    .Parameters.AddWithValue("@srid", ThisAddIn.templateSRID)
                    .Parameters.AddWithValue("@exec", ThisAddIn.GetUserName())
                    .Parameters.AddWithValue("@datetimestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
                    Dim numrec As Integer = .ExecuteNonQuery()
                    If ThisAddIn.GetUserName = "mclachd" Then System.Windows.Forms.MessageBox.Show("Query executed. " + numrec.ToString + " Records sent")
                End With
            Catch ex As MySqlException
                log.WriteToErrorLog(ex.Message, ex.StackTrace, "MySQL Error")
            Finally
                mysqlconn.Close()
                mysqlconn.Dispose()
            End Try
        Else
            log.WriteToErrorLog("Could not open db connection", "", "MySQL Error")
            mysqlconn.Dispose()
        End If
    End Using
End Sub
在这个场景中,从未到达中的SentMailTimeStamp例程

如果我取消呼叫,则两个消息框都将作为两个事件的结果显示

请让我知道,如果有任何更多的细节,你需要

亲切问候,

大卫

更新 已根据Cadogi注释修改代码。多谢各位

更新2 将对SentMailtimeStamp路由的调用包装在一个
Try
Catch
中,我确实在客户端中遇到了一个错误

Private Sub Application_ItemSend(ByVal oItem As Object, ByRef Cancel As Boolean) Handles Application.ItemSend
    System.Windows.Forms.MessageBox.Show("Application.ItemSend Event")
    log.WriteToErrorLog("Application ItemSend Reached", "", "Event")
    Try
        If TypeOf oItem Is Outlook.MailItem Then Call SentMailTimestamp(oItem)
    Catch ex As Exception
        System.Windows.Forms.MessageBox.Show(ex.Message)
    End Try
    System.Windows.Forms.MessageBox.Show("end of Itemsend Event")
End Sub
错误消息是:

无法加载文件或程序集“MySQL.Data,version=6.8.5.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d”或其依赖项之一。系统无法修改指定的文件

太棒了,如果我有进步的话。我假设已发布的项目将包含所需的所有内容

更新3 我已经解决了这个问题,这要感谢Hans,他向我指出了调试中的一些非常简单的教训——这是一个艰难的教训,因为我花了几周的时间来解决这个问题

汉斯完全正确


很明显,您缺少了一些东西,而Office程序没有 这是为了适应行为不端的插件。默认情况下,任何例外 他们在一个“尴尬”的地方被吞食而没有诊断。 唯一能说明发生了这种情况的方法是使用您认为应该使用的代码 有一个副作用就是做不到它的工作

加载项在开发机器而不是客户端上工作的原因是MySQL.Data引用需要将
Copy Local
属性设置为True

对于那些最终处于与我类似位置的人,修复方法是转到项目属性->引用。突出显示MySQL.Data并将
Copy Local
属性更改为
True


感谢大家的贡献。这一切都有助于我的学习,并有助于缩小问题的范围。

您的外接程序是否已在最终用户PC上启用


当大量项目同时添加到文件夹(超过16个)时,不会激发Items类的事件。这是Outlook中的一个已知问题。

抱歉,没有足够的分数来发表评论

SentMailTimestamp()例程是否可能正在为最终用户无权访问的网络部分上的KPI保存信息?我曾看到应用程序在没有警告或错误的情况下失败

另一件需要检查的事情是SentMailTimestamp()是否应该使用“Call”关键字,因为它可能会干扰您的结果。e、 g

Private Sub Application_ItemSend(ByVal oItem As Object, ByRef Cancel As Boolean) Handles Application.ItemSend
MsgBox("Application.ItemSend Event")
SentMailTimestamp()
End Sub
基于此:

从上面的链接:“您可以在调用子过程时使用Call关键字,但大多数情况下不建议使用该关键字。有关详细信息,请参阅Call语句(Visual Basic)。”


这是它转发到的链接:

很明显,您缺少了一些东西,Office程序无法容纳行为不正常的加载项。默认情况下,他们在“尴尬”的地方抛出的任何异常都会在没有诊断的情况下被吞没。唯一能说明发生了这种情况的方法是,您认为应该有副作用的代码只是没有完成它的工作

谷歌的“VSTO异常处理”很好地介绍了您对此所做的工作。我将复制粘贴相关部分:

Visual Studio Tools for Office可以将启动期间发生的所有错误写入日志文件,或在消息框中显示每个错误。默认情况下,这些选项对于应用程序级项目是关闭的。可以通过添加和设置环境变量来启用这些选项。要在消息框中显示每个错误,请将VSTO_SUPPRESSDISPLAYALERTS变量设置为0(零)。通过将变量设置为1(一),可以抑制消息。要将错误写入日志文件,请将VSTO_LOGALERTS变量设置为1(一)。Visual Studio Tools for Office在包含应用程序清单的文件夹中创建日志文件。默认名称为.manifest.log。要停止记录错误,请将变量设置为0(零)


在全面推出之前,我正在客户机上测试插件。每次只测试一封电子邮件,因此容量不应成为问题。我应该澄清的是,a)加载项安装时没有出现问题b)加载项安装了功能区,单击该功能区可以访问并激活表单。c) 表单捕获简单信息并打开电子邮件模板d)当发送电子邮件时,事件代码似乎不会触发。已更新代码片段以包含完整例程。如您所见,am只是将数据插入MySQL数据库。应该没有权限问题。开发计算机和桌面(客户端)计算机都是lo