.net - VSTO 插件突然无法调用外部方法
问题描述
我在使用 VSTO Outlook 插件时遇到了一个非常令人费解(且不一致)的问题。在进行一些升级时,AddIn 突然似乎无法调用项目本身内不同类中的代码。这不是引用的程序集或任何东西,只是在单独的类文件中找到的托管代码。我能够确认这一点的最好方法是添加一个警告框作为被调用方法的第一行。
在主 AddIn FormRegion 中:
Private Sub DocumentMenu_Click(sender As Object, e As EventArgs) Handles DocumentMenu.Click
Dim applicationName As String = "MyApp"
Dim supportGroupName As String = "MyAppSupport"
SetLoadingStatus("Validating user...") ' <<-- This works
MsgBox("About to call the method") ' <<-- This works
Dim userStatus As String = DocumentService.UserIsAuthorized ' <<-- Dies here
If userStatus.ToUpperInvariant() = "Valid User".ToUpperInvariant() Then
Me.SetLoadingStatus("Checking attachments...")
在 DocumentService.vb 中:
Public Shared Function UserIsAuthorized() As String
MsgBox("First line of method") '<< -- Doesn't ever come up
Try
Using handler As New RestServiceHandler
Using client As HttpClient = handler.GetRestConfiguartion()
' Etc. - irreleveant because it never gets this far
令人烦恼的是我根本没有更改发生这种情况的代码。它不会一直发生(它可以在我的机器、我同事的机器以及一台测试机器上运行,但不能在第二台或我的最终用户的机器上运行)。
我是我机器上的本地管理员,但不是任何一台测试机器(包括它工作的机器)。它在 Win7/Office 2010 和 Win10/Office 2016 机器上都失败了。(它工作的所有机器都有 Win10/Office 2016,我们的大多数客户也有。)使用 OneClick 分发和签名的 .msi 安装程序都失败了。
我确实将 .Net 框架从 4.0 更新到 4.6.2,但即使我将其回滚到 4.0,我仍然会看到这种行为。4.0 上的一个生产版本适用于 270 个用户,其中包括一个新版本不适用的用户。我们的最终用户的机器已被锁定,因此我的调试选项相当有限。在我可以复制此行为的一台测试机器上,我没有看到事件查看器中记录了任何错误。
有没有人见过这样的事情?据我所知,它只是在调用同一项目中不同类文件中的代码之前就死了。
编辑:我认为我没有说清楚的一件事 - 加载项本身加载时没有错误。有一些代码可以执行以从配置文件中提取当前环境,并且可以毫无问题地执行。该错误似乎发生在按钮单击事件上,该事件在检查用户授权后显示表单区域。
另外,我采用了 UserIsAuthorized 方法并将其添加到与按钮单击事件相同的 .vb 文件中,但仍然出现错误。就像应用程序无法在另一个方法中调用代码一样,无论在项目中的哪个位置找到该方法,这让我感到莫名其妙。
解决方案
过去,竞争插件存在问题。如果一个插件需要与另一个不同版本的 .Net,则加载的第一个插件将获胜,而另一个插件将失败。根据 office 的版本,这可能会发生,因为 office 应用程序只运行一个版本的 .Net,而不是多个版本。
检查故障电脑上的其他插件并禁用;这可能会提供答案。
推荐阅读
- python - RuntimeError:cuda 运行时错误(48):没有内核映像可用于在 mmdet/ops/roi_a lign/src/roi_align_kernel.cu:139 的设备上执行
- asp.net-core - How to get scoped information in AppInsights via NLog?
- azure - 在 Docker 容器内的 Azure 应用服务上持久保存 Solr 数据
- javascript - 只询问一次用户名,然后将其保存到 localStorage
- fullcalendar - 如何在 FullCalendar 中显示开始日期和结束日期的半事件宽度
- c# - 出队挂起时 Oracle AQ 删除并重新创建代理
- python - Python分别暂停和恢复多个函数的执行
- laravel - Laravel 查询表中的项目与另一个表中的选定关系
- azure-data-factory - 如何防止通过 azure 数据工厂复制空文件?
- python - 从嵌套字典中提取公共值以及主键